数据结构
String
方法:set、get、del、incr、decr
> set str adb
OK
> get str
adb
> del str
1
> get str
null
> set str 2
OK
> incr str
3
> get str
3
> decr str
2
场景:
1.缓存
2.计数器
3.session
Hash
即键值对结构。
方法:hset、hget、hdel、hgetall
> hset abc ddd toryxu
0
> hset abc fff toryxu
1
> hget abc fff
toryxu
> hdel abc fff
1
> hgetall abc
ddd
toryxu
> hset abc aaa toryxu
1
> hgetall abc
ddd
toryxu
aaa
toryxu
场景:
1.缓存
List
双端链表。
lpush+lpop = 栈,先进先出
lpush+rpop = 队列,先进后出
lpush+ltrim = 有限集合
ltrim:下标 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
lpush+brpop = 消息队列
brpop:获取并移除右边最后一个元素。
> rpush list1 a
2
> rpush list1 b
3
> brpop list1 0(0是timeout超时等待时间)
list1
b
> llen list1
2
> ltrim list1 1 -1
OK
> llen list1
1
Set
无序、不重复的集合。
方法:
sadd、srem、scard(获得集合数量)、smembers(展示集合元素)、sismember(判断是否存在于集合,是返回1,否返回0)
> sadd test 1 2 3 4
0
> srem test 1
1
> smembers test
2
3
4
> sismember test 3
1
> scard test
3
场站:
1.收藏、点赞
2.给用户打标签
ZSet
有序、不重复的集合,给每个元素设置一个分数
方法:
zadd、zrange、zscore
> zadd ztest 100 abc 90 bcd
2
> zrange ztest 0 1
bcd
abc
> zrange ztest 0 1 withscore
ERR syntax error
> zrange ztest 0 1 withscores
bcd
90
abc
100
> zscore ztest abc
100
> zrevrange ztest 0 1 withscores
abc
100
bcd
90
场景:
1.排行榜
Redis持久化方式
RDB
生成快照
save 900 1 (每900s有一个写入,则备份,可以多个设置组合使用)
优点:
子进程生成快照,恢复速度快。
缺点:
保存频率不够快,服务器故障可能导致数据丢失。
AOF
记录所有写操作,在服务重启的时候再执行一遍。
fsync配置将写操作存储到磁盘的周期:
always: 每个事件周期都同步刷新一次
everysec: 每一秒都同步刷新一次
no: 我只管写,让操作系统自己决定什么时候真正写入吧
优点:
就算出现服务器故障,也不会丢失太多数据。
缺点:
AOF文件更大,性能占用更高。
Redis为什么这么快
1.基于内存实现
数据都是存在内存,只有持久化的时候存到磁盘。
2.单线程执行避免上下文切换
3.高效的数据结构
List:
双端链表,头尾指针,并且在头指针上存储len。
Hash:
hash本身。
zSet:
跳表,链表的基础上增加多级索引。
4.合理的数据编码
String:存储数字的话,采用int类型的编码,如果是非数字的话,采用 raw 编码;
List:字符串长度及元素个数小于一定范围使用 ziplist 编码,任意条件不满足,则转化为 linkedlist 编码;
Hash:hash 对象保存的键值对内的键和值字符串长度小于一定值及键值对;
Set:保存元素为整数及元素个数小于一定范围使用 intset 编码,任意条件不满足,则使用 hashtable 编码;
Zset:zset 对象中保存的元素个数小于及成员长度小于一定值使用 ziplist 编码,任意条件不满足,则使用 skiplist 编码。
Redis集群
待完善。