1.String格式
一般存一个对象,是用这个对象的ID为键,将对象的所有属性格式化为json对象字符串,作为值,然后set(ID,json)进去.
但是这种方式,在只需要修改这个对象中的其中一个属性时,就需要把json转为对象,改变值,然后再转为json对象,比较消耗时间。
还有另一种方式mset();
批量set。如:
mset user:1:name xiaoh user:1:age 3
mget user:1:name user:1:age
另外,setnx可以用来做分布式锁。
setnx key value
只有当key之前不存在的时候才会设置成功,返回1;已经存在则会返回0,并且不做如何操作,不会覆盖前面key已经赋的值。
INCR article:readcount:{文章id}
也可以用来计数.,是原子操作,线程安全的。
还可以用来做全局序列号
INCR ouderID 1000
这里是每次递增1000;拿一千个数,然后自己去分配在本台服务器上。原理类似于缓存。这样可以大大提高redis服务器的性能开销。
2.hash结构
可以用来存储对象
hmset user 1:name:xh 1:age:15
hmget user 1:name 1:age
但是一个user为key的内容中不要存太多的数据,否则会造成执行时间过久,而其它命令线程阻塞。
当然可以分段。
适用于添加购物车的场景。
3.List结构
该列表是双端可操作的。
LPUSH key value[]
可以用来模拟阻塞队列,使用
BRPOP key timeout
如果队列为null,则会阻塞。
适用场景,朋友圈类似的时间流排序。
大体的操作分为push 和 poll。
举个例子
push就是
LPUSH 我的ID 朋友圈列表
poll就是
RPOP 我关注的ID 新发的朋友圈列表
LPUSH 我的ID 我关注的ID的新发的朋友圈列表再按时间排序
3.Set
无序集合
sadd key value[]
使用场景,可以用来抽奖,还有品牌筛选
比如说抽取一个可以采取一下命令
1.srandmenber key 1 # 不会删除该元素
2.spop key 1 # 会删除该元素
当然集合还有交集,差集等操作。
关键:关注模型(比如可能认识的人,差集)
4.ZSet
有序集合
每个元素带有分值,可以排序
score分值
ZADD key score member
适用场景:排行榜
比如说:点击一条,增加一个点击量
ZINCRBY hotNews:1 1
甚至可以并集取排行榜.
当遍历键列表时
keys
如果key太多可以分批遍历,使用
scan
但是在使用这个命令的同时,线上redis服务器频繁增删改查,它的结果是可能不全的。