初识Redis
Redis 初步认识
一、Redis是什么?
Remote Dictionary Service 远程字典服务
二、基本特性
速度快
支持多种数据类型
支持多种编程语言
持久化、 内存淘汰
功能丰富: 事务、 发布订阅、 pipeline、 lua
集群、 分布式
三、基本命令
set key value(增/改)
get key(查)
keys *
dbsize
exists key
del key1 key2 删)
rename key1 key2
type key
四、基本类型
String、 Hash、 Set、 List、 Zset
Hyperloglog、 Geospatial 、 Streams
1 String
存储类型
1、 INT 整型
2、 Float 单精度浮点型
3、 String 字符串
操作命令
getrange key 0 1
strlen key
append key appendValue
setnx key
mset key1 value1 key2 value2
mget key1 key2
incr key
incrby key 100
decr key
decrby key 100
set mf 2.6
incrbyfloat mf 7.3
编码
1、 int, 存储8个字节的长整型(long, 2^63-1)
2、 embstr, embstr格式的SDS,存储小于44个字节的字符串
3、 raw, SDS, 存储大于44个字节的字符串
SDS
1、 内存空间预先分配
2、 获取字符长度的时间复杂度O(n)
3、 长度变更引起内存重新分配
4、 用’\0’判断字符串结束
为什么是44
struct SDS {
int8 capacity; // 1byte
int8 len; // 1byte
int8 flags; // 1byte
byte[] content; // 内联数组,长度为 capacity
}
这里unsigned int 变成了uint8_t、uint16_t.的形式,还加了一个char flags标识,总共只用了3个字节的大小。相当于优化了sds的内存使用,相应的用于存储字符串的内存就会变大。
然后进行计算:
64byte - 16byte -3byte -1byte = 44byte。
应用场景
1、 缓存
2、 分布式Session
3、 分布式锁 set NX EX
4、 分布式全局ID incr
5、 计数器 incr
6、 限流 incr
7、 位操作
2 Hash 哈希
hash与String
Hash特点:
1、 节省内存空间
2、 减少key冲突
3、 取值减少性能消耗
Hash不适合的场景:
1、 Field不能单独设置过期时间
2、 需要考虑数据量分布的问题
存储结构
ziplist: OBJ_ENCODING_ZIPLIST(压缩列表)
hashtable: OBJ_ENCODING_HT(哈希表)
应用场景
String能做的, Hash都可以做;
存储对象类型的数据
3 List 列表
存储原理quicklist
list-max-ziplist-size(fill)
list-compress-depth(compress)
应用场景
消息列表
文章列表
评论列表
公告列表
活动列表
4 set
储存结构
1、 intset
2、 hashtable
应用场景
1、 抽奖: spop myset
2、 点赞、 签到、 打卡(用户记录)
3、 商品标签、 用户画像(人口属性、 信用属性、 社交、 兴趣爱好…)
4、 用户关注、 推荐模型
5 zset 有序集合
储存结构
ziplist(元素数量<128, 所有元素长度小于64bytes)
skiplist + dict
应用场景
排行榜
6 其他
Hyperloglogs Geo Streams
7 对比