Redis除了性能强外,还有数据结构丰富多彩。
一、String
- 单值缓存
SET key value
GET key
- 存对象
相信大家都存过,我们一般都是把对象value转json,获取的时候,再json转对象
SET user:1 value(json值)
但当我们需要对对象某个值进行修改,这种就不如下面的方式简单
MSET user:1:name zhangsan user:1age 18
MGET user:1name user:1age
- 分布式锁
SETNX product:10001 true //返回1代表成功
SETNX product:10001 true //返回0代表失败
...执行业务
DEL product:10001 //执行完释放
但这种如果没DEL回发生死锁,这时候需要设置超时时间
SET product:10001 true ex 10 nx
- incr 命令
当我们需要文章点击量时候,我们可以执行这个,执行一次代表一次点击量,
取货直接用get
分布式系统全局系列号
当前命令也可以在分布式数据库的情况下,来作为id使用,但每次获取都用这个执行一次非常耗费性能,所以可以一次性批量生成。
INCRBY orderId 1000
用法是在每个服务器取一次,一次取1000个号,在单机内存中使用,使用完再取一次,减少与redis交互。
缺点就是这种不适合连续的id,也会存在系统宕机的时候,浪费id情况。
另外也可以用雪花算法。
Spring Session底层也是用redis实现,我前面写的一篇文章,redis实现单点登入也是可以的。
Redis一定要避免bigKey,因为是单线程,如果一个key取值太久,去他操作都是在阻塞状态。
二、哈希
- 哈希结构
我们直接用电商购物车实例来使用redis哈希结构
当我们在购物车放入明朝那些事,放入软件设计两本书
当我们加购一本明朝那些事,用hincrby
这时候用hlen可以找到购物车一共两本书
可以用hgetall 找到购物车所有值
用hdel删除指定书
这样好处就是可以代替数据库来做这些操作,最后在提交的时候持久化到数据库,提高使用效率,提升用户体验感。(数据库做复杂,并且性能低)
那么哈希相对于String优缺点呢?
优点:
- 数据整合存储,方便管理。
- 相比String操作消耗内存cpu更小。
- 相比String更节省空间。
缺点:
redis集群下不适合大规模使用哈希。
(因为redis集群分片存储,当hash值过大,会存在资源倾斜放在其中一个redis节点上。)