Redis
1、什么是Redis
- NoSql数据库
- 分布式缓存中间件
- key-value存储
- 提供海量数据存储访问
- 数据存储在内存里,读取更快
2、缓存方案对比
缓存方案 | 优点 | 缺点 |
Ehcache |
|
|
Memcache |
|
|
Redis |
|
|
3、Redis的数据类型
3.1 string
string:最简单的字符串类型键值对缓存。
key相关
keys * : 查看所有的key(不建议在生产环境上使用,有性能影响)
type key: key的类型
string类型
- get/set/del:查询/设置/删除
- set key value: 设置key(已存在,则覆盖)
- setnx key value: 设置key(已存在,不覆盖)
- set key value ex time: 设置带过期时间的数据
- expire key: 设置过期时间
- ttl: 查看过期时间, -1-永不过期, -2已过期
- append key: 追加字符串
- strlen key:字符串长度
- incr key: 数字值累加一
- decr key:数字值累减一
- incrby key num: 累加给定数值
- decrby key num: 累减给定数值
- getrange key start end: 截取数据, end=-1 代表最后
- setrange key start newdata: 从start位置开始替换数据
- mset: 连续设值
- mget: 连续取值
- msetnx: 连续设值不覆盖
3.2 list
list:列表,[a,b,c,d,…]
- lpush userList 1 2 3 4 5:构建一个list,从左边开始存入数据
- rpush userList 1 2 3 4 5:构建一个list,从右边开始存入数据
- lrange list start end:获得数据
- lpop:从左侧开始拿出一个数据
- rpop:从右侧开始拿出一个数据
- llen list:list长度
- lindex list index:获取list下标的值
- lset list index value:把某个下标的值替换
- linsert list before/after value:插入一个新的值
- lrem list num value:删除几个相同数据
- ltrim list start end:截取值,替换原来的list
3.3 hash
hash:类似map,存储结构化数据结构,比如存储一个对象(不能有嵌套对象)
- hset key property value:
-> hset user name xybh
-> 创建一个user对象,这个对象中包含name属性,name值为xybh - hget user name:获得用户对象中name的值
- hmset:设置对象中的多个键值对
-> hset user age 18 phone 139123123 - hmsetnx:设置对象中的多个键值对,存在则不添加
-> hset user age 18 phone 139123123 - hmget:获得对象中的多个属性
-> hmget user age phone - hgetall user:获得整个对象的内容
- hincrby user age 2:累加属性
- hincrbyfloat user age 2.2:累加属性
- hlen user:有多少个属性
- hexists user age:判断属性是否存在
- hkeys user:获得所有属性
- hvals user:获得所有值
- hdel user:删除对象
3.4 set
set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
- sadd: 增加新元素
- sismember: 判断元素是否在set中
- sinter: 查看多个set的交集
- spop: 随机删除一个或多个元素并返回
- srandmember:随机获取一个元素
- scard: 获取set的成员数
- key: 返回集合中的所有成员
3.5 zset
sorted set:排序的set,可以去重可以排序,比如可以根据用户积分做排名,积分作为set的一个数值,根据数值可以做排序。
- zadd zset 10 value1 20 value2 30 value3:设置member和对应的分数
- zrange zset 0 -1:查看所有zset中的内容
- zrange zset 0 -1 withscores:带有分数
- zrank zset value:获得对应的下标
- zscore zset value:获得对应的分数
- zcard zset:统计个数
- zcount zset 分数1 分数2:统计个数
- zrangebyscore zset 分数1 分数2:查询分数之间的member(包含分数1 分数2)
- zrangebyscore zset (分数1 (分数2:查询分数之间的member(不包含分数1 和 分数2)
- zrangebyscore zset 分数1 分数2 limit start end:查询分数之间的member(包含分数1 分数2),获得的结果集再次根据下标区间做查询
- zrem zset value:删除member
redis sorted sets里面当items内容大于64的时候同时使用了hash和skiplist两种设计实现。这也会为了排序和查找性能做的优化。所以如上可知:
添加和删除都需要修改skiplist,所以复杂度为O(log(n))。
但是如果仅仅是查找元素的话可以直接使用hash,其复杂度为O(1)
其他的range操作复杂度一般为O(log(n))
当然如果是小于64的时候,因为是采用了ziplist的设计,其时间复杂度为O(n)
4、Redis线程模型
请求过程:
Redis-cli发送
Readable/Writable
事件,使用Socket与Redis-server通信,Redis-server使用多路复用器(同步非阻塞)将事件发送到文件事件分配器,文件事件分配器根据请求类型转发至连接应答处理器/命令请求处理器/命令应答处理器
。
5、发布与订阅
5.1 发布
publish channel messgae: 将消息发送到指定的频道。
5.2 订阅
psubscribe pattern 订阅一个获多个符合给定模式的频道
pubsub subcommand 查看订阅和发布系统状态
subscribe channel 订阅给定的一个或多个频道的信息
unsubscibe channel 退订给定的频道
6、Redis读写分离(主从架构)
6.1 主从架构
Redis主从架构: master节点做到一个分发命令的功能,主节点将数据复制给从库节点。(水平扩展,通过增加服务器来提高性能)
6.2 主从原理
- 从Redis第一次连接主Redis,使用全量复制
- 从服务器连接主服务器,发送SYNC命令;
- 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
- 服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
- 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
- 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
- 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
- 增量同步
Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。Redis主从同步策略
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全