天天看点

Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

1. Redis 中5种数据类型

Redis是一种基于键值对的NoSQL数据库,它的值主要由string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合)五种基本数据结构构成,除此之外还支持一些其他的数据结构和算法。key都是由字符串构成的。

 string String

 hash HashMap

 list LinkedList

 set HashSet

 sorted_set TreeSet

2.String 类型

字符串类型是Redis最基础的数据结构,字符串类型可以是JSON、XML甚至是二进制的图片等数据,但是最大值不能超过512MB。

2.1 内部编码

Redis会根据当前值的类型和长度决定使用哪种内部编码来实现。

字符串类型的内部编码有3种:

int:8个字节的长整型。

embstr:小于等于39个字节的字符串。

raw:大于39个字节的字符串。

  • redis 自身是一个 Map,其中所有的数据都是采用 key : value 的形式存储
  • 数据类型指的是存储的数据的类型,也就是 value 部分的类型,key 部分永远都是字符串
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

2.1String 类型

  • 存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
  • 存储数据的格式:一个存储空间保存一个数据
  • 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用
    Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

2.2 string 类型数据的基本操作

  • 添加/修改数据

    set key value

  • 获取数据

    get key

  • 删除数据

    del key

  • 添加/修改多个数据

    mset key1 value1 key2 value2 …

  • 获取多个数据

    mget key1 key2 …

  • 获取数据字符个数(字符串长度)

    strlen key

  • 追加信息到原始信息后部(如果原始信息存在就追加,否则新建)

    append key value

Multiple[ˈmʌltɪpl]

Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

其实很好理解:我们同时操作的指令很多的时候 可以使用多指令进行操作,如果同时操作的指令不是很多单指令和多指令的区别不是很大

2.3 string 类型数据的扩展操作

设置数值数据增加指定范围的值
incr key
incrby key increment
incrbyfloat key increment

设置数值数据减少指定范围的值
decr key
decrby key increment
           
  • string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算。
  • redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发

    带来的数据影响。

  • 注意:按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis 数值上限范围,将报错。

    9223372036854775807(java中long型数据最大值,Long.MAX_VALUE)

Tips 1:

  • redis用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性
  • 此方案适用于所有数据库,且支持数据库集群
设置数据具有指定的生命周期
解决方案
setex key seconds value
psetex key milliseconds value

redis 控制数据的生命周期,
通过数据是否失效控制业务行为,
适用于所有具有时效性限定控制的操作
           

string 类型数据操作的注意事项

数据操作不成功的反馈与数据正常操作之间的差异

① 表示运行结果是否成功

 (integer) 0 → false 失败

 (integer) 1 → true 成功

② 表示运行结果值

 (integer) 3 → 3 3个

 (integer) 1 → 1 1个

 数据未获取到

(nil)等同于null

 数据最大存储量

512MB

 数值计算最大范围(java中的long的最大值)

9223372036854775807

2.4 使用场景

1.2.1 缓存

在web服务中,使用MySQL作为数据库,Redis作为缓存。由于Redis具有支撑高并发的特性,通常能起到加速读写和降低后端压力的作用。web端的大多数请求都是从Redis中获取的数据,如果Redis中没有需要的数据,则会从MySQL中去获取,并将获取到的数据写入redis。

1.2.2 计数

Redis中有一个字符串相关的命令incr key,incr命令对值做自增操作,返回结果分为以下三种情况:

值不是整数,返回错误

值是整数,返回自增后的结果

key不存在,默认键为0,返回1

比如文章的阅读量,视频的播放量等等都会使用redis来计数,每播放一次,对应的播放量就会加1,同时将这些数据异步存储到数据库中达到持久化的目的。

1.2.3 共享Session

在分布式系统中,用户的每次请求会访问到不同的服务器,这就会导致session不同步的问题,假如一个用来获取用户信息的请求落在A服务器上,获取到用户信息后存入session。下一个请求落在B服务器上,想要从session中获取用户信息就不能正常获取了,因为用户信息的session在服务器A上,为了解决这个问题,使用redis集中管理这些session,将session存入redis,使用的时候直接从redis中获取就可以了。

1.2.4 限速

为了安全考虑,有些网站会对IP进行限制,限制同一IP在一定时间内访问次数不能超过n次。

业务场景

主页高频访问信息显示控制,例如新浪微博大V主页显示粉丝数与微博数量

Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

3 Hash 类型

3.0 内部编码

哈希类型的内部编码有两种:

ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)同时所有值都小于hash-max-ziplist-value配置(默认64字节)时使用。ziplist使用更加紧凑的结构实现多个元素的连续存储,所以比hashtable更加节省内存。

hashtable(哈希表):当ziplist不能满足要求时,会使用hashtable。

Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

3.1 hash 类型数据的基本操作

添加/修改数据

hset key field value
           

 获取数据

hget key field
hgetall key
           

 删除数据

添加/修改多个数据

hmset key field1 value1 field2 value2 … 
           

获取多个数据

hmget key field1 field2 … 
           

 获取哈希表中字段的数量

hlen key
           

 获取哈希表中是否存在指定的字段

hexists key field
           

3.2 hash 类型数据扩展操作

获取哈希表中所有的字段名或字段值

hkeys key
hvals key
           

 设置指定字段的数值数据增加指定范围的值

hincrby key field increment
hincrbyfloat key field increment
           

hash 类型数据操作的注意事项

  • hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil)
  • 每个 hash 可以存储 2的32次方 - 1 个键值对
  • hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
  • hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

4 列表 List

列表类型用来存储多个有序的字符串,一个列表最多可以存储2^32-1个元素,列表的两端都可以插入和弹出元素。

4.1 内部编码

列表的内部编码有两种:

ziplist(压缩列表):当哈希类型元素个数小于list-max-ziplist-entries配置(默认512个)同时所有值都小于list-max-ziplist-value配置(默认64字节)时使用。ziplist使用更加紧凑的结构实现多个元素的连续存储,所以比hashtable更加节省内存。

linkedlist(链表):当ziplist不能满足要求时,会使用linkedlist。

Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

4.2 list 类型数据基本操作

添加/修改数据

lpush key value1 [value2] ……
rpush key value1 [value2] ……
           

 获取数据

lrange key start stop
lindex key index
llen key 
           

 获取并移除数据

lpop key
rpop key
           

4.3 list 类型数据扩展操作

规定时间内获取并移除数据

blpop key1 [key2] timeout
brpop key1 [key2] timeout
brpoplpush source destination timeout
           

b是block 阻塞的意思

brpoplpush 表示从一个List获取移除到另外一个list里面

移除指定数据

lrem key count value
           

Tips 6:

 redis 应用于具有操作先后顺序的数据控制

list 类型数据操作注意事项

Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

4.3 使用场景

4.3.1 消息队列

列表用来存储多个有序的字符串,既然是有序的,那么就满足消息队列的特点。使用lpush+rpop或者rpush+lpop实现消息队列。除此之外,redis支持阻塞操作,在弹出元素的时候使用阻塞命令来实现阻塞队列。

4.3.2 栈

由于列表存储的是有序字符串,满足队列的特点,也就能满足栈先进后出的特点,使用lpush+lpop或者rpush+rpop实现栈。

4.3.3 文章列表

因为列表的元素不但是有序的,而且还支持按照索引范围获取元素。因此我们可以使用命令lrange key 0 9分页获取文章列表

Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

从中间移除元素可以使用 lrem 命令

Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

5.集合 Set

集合类型也可以保存多个字符串元素,与列表不同的是,集合中不允许有重复元素并且集合中的元素是无序的。一个集合最多可以存储2^32-1个元素。

5.1 内部编码

集合类型的内部编码有两种:

intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,redis会选用intset来作为集合的内部实现,从而减少内存的使用。

hashtable(哈希表):当intset不能满足要求时,会使用hashtable。

Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

5.2 set 类型数据的基本操作

添加数据

sadd key member1 [member2]

获取全部数据

smembers key

删除数据

srem key member1 [member2]

获取集合数据总量

scard key

判断集合中是否包含指定数据

sismember key member

5.3 set 类型数据的扩展操作

Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

随机获取集合中指定数量的数据

srandmember key [count]

随机获取集合中的某个数据并将该数据移出集合

spop key [count]

Tips 8:

 redis 应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热卖旅游线路,应用APP推荐,大V推荐等

Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

求两个集合的交、并、差集

sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]
           

求两个集合的交、并、差集并存储到指定集合中

sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2] 
           

将指定数据从原始集合中移动到目标集合中

smove source destination member 
           
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

set 类型数据操作的注意事项

 set 类型不允许数据重复,如果添加的数据在 set 中已经存在,将只保留一份

 set 虽然与hash的存储结构相同,但是无法启用hash中存储值的空间

Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

5.4 使用场景

5.4.1 用户标签

例如一个用户对篮球、足球感兴趣,另一个用户对橄榄球、乒乓球感兴趣,这些兴趣点就是一个标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同感兴趣的标签。给用户打标签的时候需要①给用户打标签,②给标签加用户,需要给这两个操作增加事务。

给用户打标签

sadd user:1:tags tag1 tag2

给标签添加用户

sadd tag1:users user:1

sadd tag2:users user:1

使用交集(sinter)求两个user的共同标签

sinter user:1:tags user:2:tags

5.4.2 抽奖功能

集合有两个命令支持获取随机数,分别是:

随机获取count个元素,集合元素个数不变

随机弹出count个元素,元素从集合弹出,集合元素个数改变

用户点击抽奖按钮,参数抽奖,将用户编号放入集合,然后抽奖,分别抽一等奖、二等奖,如果已经抽中一等奖的用户不能参数抽二等奖则使用spop,反之使用srandmember。

6 sorted_set 有序集合

有序集合和集合一样,不能有重复元素。但是可以排序,它给每个元素设置一个score作为排序的依据。最多可以存储2^32-1个元素。

Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

6.1 内部编码

有序集合类型的内部编码有两种:

ziplist(压缩列表):当有序集合的元素个数小于list-max-ziplist-entries配置(默认128个)同时所有值都小于list-max-ziplist-value配置(默认64字节)时使用。ziplist使用更加紧凑的结构实现多个元素的连续存储,更加节省内存。

skiplist(跳跃表):当不满足ziplist的要求时,会使用skiplist。

6.2 sorted_set 类型数据的基本操作

  • 添加数据

    zadd key score1 member1 [score2 member2]

  • 获取全部数据

    zrange key start stop [WITHSCORES]

    zrevrange key start stop [WITHSCORES]

  • 删除数据

    zrem key member [member …]

  • 按条件获取数据

    zrangebyscore key min max [WITHSCORES] [LIMIT]

    zrevrangebyscore key max min [WITHSCORES]

  • 条件删除数据

    zremrangebyrank key start stop

    zremrangebyscore key min max

    注意:

     min与max用于限定搜索查询的条件

     start与stop用于限定查询范围,作用于索引,表示开始和结束索引

     offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量

  • 获取集合数据总量

    zcard key

    zcount key min max

  • 集合交、并操作

    zinterstore destination numkeys key [key …]

    zunionstore destination numkeys key [key …]

6.3 sorted_set 类型数据的扩展操作

Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
  • 获取数据对应的索引(排名)

    zrank key member

    zrevrank key member

  • score值获取与修改

    zscore key member

    zincrby key increment member

    Tips 13:  redis 应用于计数器组合排序功能对应的排名

sorted_set 类型数据操作的注意事项

  • score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992
  • score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时候要慎重
  • sorted_set 底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

6.4 使用场景

6.4.1 排行榜

用户发布了n篇文章,其他人看到文章后给喜欢的文章点赞,使用score来记录点赞数,有序集合会根据score排行。流程如下

用户发布一篇文章,初始点赞数为0,即score为0

zadd user:article 0 a

有人给文章a点赞,递增1

zincrby user:article 1 a

查询点赞前三篇文章

zrevrangebyscore user:article 0 2

查询点赞后三篇文章

zrangebyscore user:article 0 2

6.4.2 延迟消息队列

下单系统,下单后需要在15分钟内进行支付,如果15分钟未支付则自动取消订单。将下单后的十五分钟后时间作为score,订单作为value存入redis,消费者轮询去消费,如果消费的大于等于这笔记录的score,则将这笔记录移除队列,取消订单。

7. 数据类型实践案例

Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结
Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结

8 五种数据类型总结

Redis五中数据类型和应用场景分析1. Redis 中5种数据类型2.String 类型3 Hash 类型4 列表 List5.集合 Set6 sorted_set 有序集合7. 数据类型实践案例8 五种数据类型总结