Redis在我们日常工作中使用的非常频繁,但是很多同学只会使用string类型,那么今天笔者梳理下redis中常用的5种数据类型,分别适用于哪些业务场景和基本操作,让大家以后能够在合适的缓存场景使用合适的数据类型。

Redis在我们日常工作中使用的非常频繁,但是也有人只会使用string类型,那么今天笔者梳理下redis中常用的5种数据类型,分别适用于哪些业务场景和基本操作,让大家以后能够在合适的缓存场景使用合适的数据类型。

Redis支持的字符串类型不是定长分配的字符串,是动态变长字符串,修改字符串在没有增加特别多内容的情况下不需要重新分配内存空间,内部结构实现上有点类似于java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

Redis支持的字符串类型不是定长分配的字符串,是动态变长字符串,修改字符串在没有增加特别多内容的情况下不需要重新分配内存空间,内部结构实现上有点类似于java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

字符串类型常用的场景有以下这些:

字符串类型常用的场景有以下这些:

1)缓存结构体信息:

缓存结构体信息:

将结构体json序列化成字符串,然后将字符串保存在redis的value中,将结构体的业务唯一标示作为key;这种保存json的用法用的最多的场景就是缓存用户信息,将用户bean信息转成json再序列化为字符串作为value保存在redis中,将用户id作为key。从代码中获取用户缓存信息就是一个逆过程,根据userid作为key获取到结构体json,然后将json转成java
bean。

将结构体json序列化成字符串,然后将字符串保存在redis的value中,将结构体的业务唯一标示作为key;这种保存json的用法用的最多的场景就是缓存用户信息,将用户bean信息转成json再序列化为字符串作为value保存在redis中,将用户id作为key。从代码中获取用户缓存信息就是一个逆过程,根据userid作为key获取到结构体json,然后将json转成java
bean。

基本操作:

基本操作:

127.0.0.1:6379> set user.10001 {“id”:”10001”,”name”:”monkey”} 1
127.0.0.1:6379> set user.10001 {“id”:”10001”,”name”:”monkey”} 1

2)计数功能:

计数功能:

我们都知道redis是单线程模式,并且redis将很多常用的事务操作进行了封装,这里我们最常用的就是数值自增或自减,redis的作者封装了incr可以进行自增,没调用一次自增1,因为redis是单线程运行,所以就算client是多线程调用那么也是正确自增,因为incr命令中将read和write做了事务封装。同样可以设置incr的step,每次根据step进行自增,当然如果要达到自减的效果,那么只要将step设置为负数就可以了。

我们都知道redis是单线程模式,并且redis将很多常用的事务操作进行了封装,这里我们最常用的就是数值自增或自减,redis的作者封装了incr可以进行自增,没调用一次自增1,因为redis是单线程运行,所以就算client是多线程调用那么也是正确自增,因为incr命令中将read和write做了事务封装。同样可以设置incr的step,每次根据step进行自增,当然如果要达到自减的效果,那么只要将step设置为负数就可以了。

计数功能使用的场景很多,我们之前经常用在实时计数统计场景,也用在过库存场景、限流计数场景等等,而且redis的性能也是非常高的,对于一般的并发量没那么高的系统都是适用的。

计数功能使用的场景很多,我们之前经常用在实时计数统计场景,也用在过库存场景、限流计数场景等等,而且redis的性能也是非常高的,对于一般的并发量没那么高的系统都是适用的。

基本操作:

基本操作:

127.0.0.1:6379> set num 1127.0.0.1:6379> incr num 2127.0.0.1:6379> incrby num 2 4
127.0.0.1:6379> set num 1127.0.0.1:6379> incr num 2127.0.0.1:6379> incrby num 2 4

redis的列表的数据结构和Java中的LinkedList比较类似,所以List类型的前后插入和删除速度是非常快的,但是随机定位速度非常慢,时间复杂度是O需要对列表进行遍历。

redis的列表的数据结构和Java中的LinkedList比较类似,所以List类型的前后插入和删除速度是非常快的,但是随机定位速度非常慢,时间复杂度是O需要对列表进行遍历。

1)list列表结构常用来做异步队列使用

list列表结构常用来做异步队列使用

将需要延后处理的任务结构体序列化成字符串塞进 Redis
的列表,另一个线程从这个列表中轮询数据进行处理。

将需要延后处理的任务结构体序列化成字符串塞进 Redis
的列表,另一个线程从这个列表中轮询数据进行处理。

2)list可用于秒杀抢购场景

list可用于秒杀抢购场景

在商品秒杀场景最怕的就是商品超卖,为了解决超卖问题,我们经常会将库存商品缓存到类似MQ的队列中,多线程的购买请求都是从队列中取,取完了就卖完了,但是用MQ处理的化有点重,这里就可以使用redis的list数据类型来实现,在秒杀前将本场秒杀的商品放到list中,因为list的pop操作是原子性的,所以即使有多个用户同时请求,也是依次pop,list空了pop抛出异常就代表商品卖完了。

在商品秒杀场景最怕的就是商品超卖,为了解决超卖问题,我们经常会将库存商品缓存到类似MQ的队列中,多线程的购买请求都是从队列中取,取完了就卖完了,但是用MQ处理的化有点重,这里就可以使用redis的list数据类型来实现,在秒杀前将本场秒杀的商品放到list中,因为list的pop操作是原子性的,所以即使有多个用户同时请求,也是依次pop,list空了pop抛出异常就代表商品卖完了。

基本操作:

基本操作:

//库存为3瓶可乐> rpush goods:cola cola cola cola 3> lpop goods:cola"cola"> lpop goods:cola"cola"
//库存为3瓶可乐> rpush goods:cola cola cola cola 3> lpop goods:cola"cola"> lpop goods:cola"cola"

redis的hash相当于hashmap,内部实现上和hashmap一致,数组+链表的数据结构。

redis的hash相当于hashmap,内部实现上和hashmap一致,数组+链表的数据结构。

金沙城中心赌场 1Screenshot
2018-09-20 17.50.55

金沙城中心赌场 2image.png

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图