背景:当时antirez为统计网站页面次数,把代码中的缓存抽离到了单独应用,数据结构也很简单,就是键值对的保存。
名字由来:Remote DIctionary Service kv
表格存储,二维
结构化数据,schema
表之间关联
SQL语句操作
事务 ACID 酸
向上扩展,不支持动态扩容
表结构固定
基于磁盘读写压力
非结构化
扩展强
无事务特性 BASE 碱
支持海量数据存储与高并发操作
分布式
KV
文档存储 MongoDB
列存储 HBase
图存储 Graph
对象存储
XML存储
NewSQL TiDB:结合关系型与非关系型
高吞吐,高性能
丰富的数据类型
分布式
丰富的功能:持久化,过期性
客户端完善
高可用,支持扩容
数据类型
Redis中支持的多种数据结构:string,lists,sets,zset,hash,bit arrays,hyperlogslogs,streams
其中前面五个是常用数据类型,后面三个是新增加的数据类型,我们着重介绍前面五种数据类型。
INT,Float,String:分别为整形,浮点型,字符串型
dict---- hashtable---KV----dictEntry:字典型,由hashtable的kv结构,使用十字邻接矩阵
String三种编码
int: 存储8个字节的长整型(long),大小不超过( 2^63-1),超过则使用下面两种类型存储
embstr:embstr格式的SDS(Simple Dynamic String),存储小于44个字节的字符串
raw: SDS, 存储大于44个字节的字符串
SDS中结构的解析:
char[] :Redis由C语言开发,其中对文件读写不使用字符串数据原因
内存空间分配
遍历字符数组长度O(n)
长度变化,内存重新分配
\0 标记文件结尾,二进制不安全
SDS:结构
长度时间o(1)
空间预分配,惰性空间释放,减少内存分配此处
len来避免\0来判断文件是否结束
embstr和raw的区别?
embstr redisObject SDS 连续分配,只读
raw 分配两次
embstr和raw什么时候转化?会还原?
增加会修改为raw
不能逆转
目的:节省内存
一些不经常变化的数据,可放入缓存
分布式Session
分布式锁:set NX EX
set expire:session:userid:36 userInfo ex 100 nx
get expire:session:userid:36
ttl expire:session:userid:36
incr 实现统一序号递增,全局ID
incr 计数器(阅读量,点赞数)
incr 限流(ip+userinfo限制访问)
set room:number 36502
incr room:number 36502
setbit 位操作(在线用户统计)
setbit video:2001 502 1
getbit video:2001 502
getbit video:2001 503
hset, hget,hgetall,hexists|hmset,hmget| hkeys,hvals|hdel,hlen
hmset user:key:36 name payne age 18 like yours
hmget user:key:36 name age like
hgetall user:key:36
---------
hget user:key:36 age
hexists user:key:36 like
-------
hkeys user:key:36
hvals user:key:36
-------
hlen user:key:36
hdel user:key:36 name age
ziplist 压缩列表使用条件:ziplist-entries 小于512|ziplist-value 小于 64
https://blog.csdn.net/qiangzhenyi1207/article/details/80353104
hb hash表特点:十字邻接矩阵解决hash冲突,两个hash表是用来扩容,缩容的
1. 购物车
lpush queue:weibo:36 1 2 3
rpush queue:weibo:36 4 5
lindex queue:weibo:36 0
lrange queue:weibo:36 0 -1 (-1代表列尾)
ziplist(前期)
linklist (前期)
quicklist(最新)
quicklist-> quicklistNode->ziplist
微博时间线
sadd set:friends:36 1 2 3 4 5 32 43 111 120
smembers set:friends:36
scard set:friends:36
srandmember set:friends:36
spop set:friends:36 2
srem set:friends:36 120
sismember set:friends:36 | 判断成员元素是否是集合的成员
del set:friends:36
intset 为整型,并且小于512个值
hashtable key存储值,value为空
抽奖
微博点赞集合,签到,打卡
商品评价标签
用户关注、推荐模型: 相互关注,我关注的人也关注了他, 可能认识的人
sdiff set1 set2 | (error) CROSSSLOT Keys in request don‘t hash to the same slot,两个集合需要在同一个master
sinter set1 set2
sunion set1 set2
zadd myzset 10 java 20 php 30 ruby 40 cpp 50 python
zrange myzset 0 -1 withscores
zrevrange myzset 0 -1 withscores
zrangebyscore myzset 20 30
zrem myzset php cpp
zcard myzset
zincrby myzset 5 python
zcount myzset 20 60
zrank myzset java
zscore myzset java
ziplist 有序集合中存储小于128个,且所有元素值小于64字节
skiplist+dict 跳表+字典
什么是skiplist?
增加指针,level是随机的,让跳表更加灵活高效。
百度排行榜
原文:https://www.cnblogs.com/Payne-SeediqBale/p/11747576.html