1.redis五种数据类型和消息订阅
1、 Redis String数据结构
简介:String是最常用的一种数据类型,普通的key/value存储都可以归为此类
1、set/get
1)设置key对应的值为String类型的value
2)获取key对应的值
2、mget
批量获取多个key的值,如果可以不存在则返回nil
3、incr && incrby
incr对key对应的值进行加加操作,并返回新的值;incrby加指定值
4、decr && decrby(原子操作)
decr对key对应的值进行减减操作,并返回新的值;decrby减指定值
5、setnx
设置key对应的值为String类型的value,如果key已经存在则返回0
6、setex
设置key对应的值为String类型的value,并设定有效期
7、其他命令
1)getrange 获取key对应value的子字符串
2)mset
批量设置多个key的值,如果成功表示所有值都被设置,否则返回0表示没有任何值被设置
3)msetnx,同mset,不存在就设置,不会覆盖已有的key
4)getset 设置key的值,并返回key旧的值
5)append
给指定key的value追加字符串,并返回新字符串的长度
2、Hash数据结构
1、Hash是一个String类型的field和value之间的映射表,
2、redis的Hash数据类型的key(hash表名称)对应的value实际的内部存储结构为一个HashMap
3、Hash特别适合存储对象。
相对于把一个对象的每个属性存储为String类型,将整个对象存储在Hash类型中会占用更少内存。
4、所存储的成员较少时数据存储为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。
5、运用场景:
如用一个对象来存储用户信息,商品信息,订单信息等等。
6、Hash命令讲解:
1、 hset——设置key对应的HashMap中的field的value
2、 hget——获取key对应的HashMap中的field的value
3、 hgetall——获取key对应的HashMap中的所有field的value
4、hlen--返回key对应的HashMap中的field的数量
3、List类型数据结构
1、lpush——在key对应的list的头部添加一个元素
2、lrange——获取key对应的list的指定下标范围的元素,-1表示获取所有元素
3、lpop——从key对应的list的尾部删除一个元素,并返回该元素
4、rpush——在key对应的list的尾部添加一个元素
5、rpop——从key对应的list的尾部删除一个元素,并返回该元素
4、Set数据结构
1、sadd——在key对应的set中添加一个元素
2、smembers——获取key对应的set的所有元素
3、spop——随机返回并删除key对应的set中的一个元素
4、suion——求给定key对应的set并集
5、sinter——求给定key对应的set交集
5、SortSet数据结构
1、zadd ——在key对应的zset中添加一个元素
2、zrange——获取key对应的zset中指定范围的元素,-1表示获取所有元素
3、zrem——删除key对应的zset中的一个元素
4、zrangebyscore——返回有序集key中,指定分数范围的元素列表,排行榜中运用
5、zrank——返回key对应的zset中指定member的排名。其中member按score值递增(从小到大);
排名以0为底,也就是说,score值最小的成员排名为0,排行榜中运用
set是通过hashmap存储,key对应set的元素,value是空对象
sortset是怎么存储并实现排序的呢,hashmap存储,还加了一层跳跃表
跳跃表:相当于双向链表,在其基础上添加前往比当前元素大的跳转链接
6、redis消息订阅发布
简介:redis消息订阅发布讲解,基础使用,发布订阅类似于信息管道,用来进行系统之间消息解耦,类似于mq,rabbitmq、rocketmq、kafka、activemq,
主要有消息发布者和消息订阅者。比如运用于:订单支付成功,会员系统加积分、钱包进行扣钱操作、发货系统(下发商品)
1、PUBLISH
将信息message发送到指定的频道channel。返回收到消息的客户端数量
2、SUBSCRIBE
订阅给指定频道的信息
3、UNSUBSCRIBE
取消订阅指定的频道,如果不指定,则取消订阅所有的频道。
redis的消息订阅发布和mq对比?
答:redis发布订阅功能比较薄弱但比较轻量级,mq消息持久化,数据可靠性比较差,无后台功能可msgId、msgKey进行查询消息
2、 Redis和memcached和mysql之间的区别
简介:分析三者的区别和为什么越来越多的人抛弃memcached选择redis
1、从数据库类型、数据存储方式、特殊功能讲解Redis和memcached和mysql的区别
2、作为同款功能的内存缓存产品,redis和memcached各有什么优势
内存管理机制
1) Memcached默认使用Slab Allocation机制管理内存,其主要思想是按照预先规定的大小,
将分配的内存分割成特定长度的块 以存储相应长度的key-value数据记录,以完全解决内存碎
片问题。空闲列表进行判断存储状态
【类似于Java虚拟机对象的分配,空闲列表】
2) Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,
会在一定程度上存在内存碎片
【CPU内存是连续,类似于Java虚拟机对象的分配,直接内存分配(指针碰撞)】
数据持久化方案
1)memcached不支持内存数据的持久化操作,所有的数据都以in-memory的形式存储。
2)redis支持持久化操作。redis提供了两种不同的持久化方法来讲数据存储到硬盘里面,
第一种是rdb形式,一种是aof形式
rdb:属于全量数据备份,备份的是数据
aof:append only if,增量持久化备份,备份的是指令
[如:set key, del key]
缓存数据过期机制 key,在一个小时之后过期,超过一个小时查数据就会查不到 key:"1",value:"2"
1)Memcached 在删除失效主键时也是采用的消极方法,即 Memcached 内部也不会监视主键是否失效,而是在通过 Get 访问主键时才会检查其是否已经失效
2)Redis 定时、定期等多种缓存失效机制,减少内存泄漏
支持的数据类型
1)Memcached支持单一数据类型,[k,v]
2)redis支持五种数据类型
3.redis事务和mysql事务讲解
1、 关系型数据库事务
1、一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的:
1)为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
2)当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
2、事务的ACID四大特性
原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行[3]。
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束[3]。
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行[3]。
持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中[3]。
3、事务隔离机制: set global transaction isolation level read uncommitted;
read uncommitted、read committed、repeatable read、serializable
2、redis事务机制
1、 MULTI 与 EXEC命令
以 MULTI 开始一个事务,然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令
2、 DISCARD命令
DISCARD 命令用于取消一个事务, 它清空客户端的整个事务队列, 然后将客户端从事务状态调整回非事务状态, 最后返回字符串 OK 给客户端, 说明事务已被取消。
3、WATCH命令
WATCH 命令用于在事务开始之前监视任意数量的键: 当调用 EXEC 命令执行事务时, 如果任意一个被监视的键已经被其他客户端修改了, 那么整个事务不再执行, 直接返回失败。
4、redis事务与传统关系型事务的比较
简介:讲解redis事务ACID
1、 原子性(Atomicity)
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
如果一个事务队列中的所有命令都被成功地执行,那么称这个事务执行成功。
2、 一致性(Consistency)
入队错误
在命令入队的过程中,如果客户端向服务器发送了错误的命令,比如命令的参数数量不对,等等, 那么服务器将向客户端返回一个出错信息, 并且将客户端的事务状态设为 REDIS_DIRTY_EXEC 。
执行错误
如果命令在事务执行的过程中发生错误,比如说,对一个不同类型的 key 执行了错误的操作, 那么 Redis 只会将错误包含在事务的结果中, 这不会引起事务中断或整个失败,不会影响已执行事务命令的结果,也不会影响后面要执行的事务命令, 所以它对事务的一致性也没有影响。
3、隔离性(Isolation)
WATCH 命令用于在事务开始之前监视任意数量的键: 当调用 EXEC 命令执行事务时, 如果任意一个被监视的键已经被其他客户端修改了, 那么整个事务不再执行, 直接返回失败。
4、持久性(Durability)
因为事务不过是用队列包裹起了一组 Redis 命令,并没有提供任何额外的持久性功能,所以事务的持久性由 Redis 所使用的持久化模式决定