redis五种数据类型
Posted ritualyang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis五种数据类型相关的知识,希望对你有一定的参考价值。
redis:5种数据类型
针对key的命令
keys (keys pattern) # 根据指定规则返回符合条件的key del (del key1 key2) # 删除指定的key exists (exists key) # 判断是否存在指定的key move (move key db) # 将指定的key移入到指定的数据库中 rename (rename key newkey) # 对key进行重命名 renamenx (renamenx key newkey) # 仅当newkey不存在时,将key改名为newkey type (type key) # 返回key的类型 expire (expire key second) # 给指定的key设置失效时间 expireat (expireat key timestamp) # 以时间戳的形式设置key的失效时间。 pexpireat (prxpireat key timestamp) # 以毫秒为单位设置key的失效时间 persist (persist key) # 移除key的失效时间 ttl (ttl key) # 以秒为单位返回key的剩余时间(-2表示key不存在,返回-1表示永远不过时) pttl (pttl key) # 以毫秒为单位返回key的失效时间 randomkey (randomkey) # 随机返回一个key dump (dump key) # 序列化给定key
字符串string
介绍
字符串类型是Redis中最为基础的数据存储类型,是一个由字节组成的序列,他在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据货Json对象描述信息等,是标准的key-value,一般来存字符串,整数和浮点数。Value最多可以容纳的数据长度为512MB
应用场景
很常见的场景用于统计网站访问数量,当前在线人数等,incr命令(++操作)。redis对于KV的操作效率很高,可以直接用作计数器。例如,统计在线人数等等,另外string类型是二进制存储安全的,所以也可以使用它来存储图片,甚至是视频等。
- 底层实现
- 简单动态字符串SDS
属性
- len buf中已经占有的长度(表示此字符串的实际长度)
- free buf中未使用的缓冲区长度
- buf[] 实际保存字符串数据的地方
- len buf中已经占有的长度(表示此字符串的实际长度)
- 简单动态字符串SDS
特性
- redis为字符分配空间的次数是小于等于字符串的长度N,而原C语言中的分配原则必为N。降低了分配次数提高了追加速度,代价就是多占用一些内存空间,且这些空间不会自动释放。
- 二进制安全的
- 高效的计算字符串长度(时间复杂度为O(1))
- 高效的追加字符串操作
- redis为字符分配空间的次数是小于等于字符串的长度N,而原C语言中的分配原则必为N。降低了分配次数提高了追加速度,代价就是多占用一些内存空间,且这些空间不会自动释放。
操作命令
set (set key value) # 添加key与对应的value get (get key) # 根据key获取对应value setnx (setnx key value) # setrange (setrange key startIndex value) # 替换字符串 mset (mset key1 value1 key2 value2) # 批量设置键值对(可覆盖) msetnx (msetnx key1 value1 key2 value2) # 如果key已经存在会设置失败(不可覆盖) getset (getset key newValue) # 获取key的value然后设置新的value getrange (getrange key startIndex endIndex)# 获取指定位置的数据 mget (mget key1 key2 key3) # 批量获取 inr (incr key) # 自增1 incrby (incrby key num) # 指定自增的数量 decr (decr key) # 自减1 decrby (decrby key num) # 指定自减的数量 append (append key value) # 给指定的字符串追加value的值 strlen (strlen key) # 获取指定的key对应的值的长度
列表list
介绍
Redis的列表允许用户从序列的两端推入或者弹出元素,列表由多个字符串值组成的有序可重复的序列,是链表结构,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。List中可以包含的最大元素数量是4294967295。
应用场景
列表类型,可以用于实现消息队列,也可以使用它提供的range命令,做分页查询功能。1.最新消息排行榜。2.消息队列,以完成多程序之间的消息交换。可以用push操作将任务存在list中(生产者),然后线程在用pop操作将任务取出进行执行。(消费者)
- 底层实现
- ziplist
属性
- 由表头和N个entry节点和压缩列表尾部标识符zlend组成的一个连续的内存块
- 插入和删除元素的时候,都需要对内存进行一次扩展或缩减
- 更新效率低下
- 由表头和N个entry节点和压缩列表尾部标识符zlend组成的一个连续的内存块
- linkedlist
属性
- 双向链表
- 查询的效率是O(n)
- 插入和删除效率很高
- 双向链表
- quicklist(3.2版本后)
属性
- 双向链表结构
- 插入删除效率很高,查询的效率是O(n)
- 访问两端的元素的时间复杂度是O(1)
- 每个quicklist节点就是一个ziplist,具备压缩列表的特性
- 双向链表结构
- ziplist
特性
- 列表类型
- 有序性
- 列表类型
操作命令
lpush (lpush key value1 value2) # 从集合开头往list添加value rpush (rpush key value) # 从集合末尾往list添加value linsert (linsert key before/after value newValue) # 再指定的value前后者后插入新value lset (lset key index newValue) # 设置指定下表的新value lrem (lrem key count value) # 删除count个与value相同的value,count>0从开始位置进行删除 # count<0从末尾开始删除,count=0删除全部 ltrim (ltrim key startIndex endIndex) # 删除指定范围内意外的元素,保留指定范围内的元素 lpop (lpop key) # 从list头部开始删除 rpop (lpop key) # 从list尾部开始删除 lindex (lindex key index) # 返回指定索引处的元素 llen (llen key) # 返回list的长度 rpoplpush (rpoplpush key1 key2) # 从key1的list弹出最后一个value添加到key2的list中
散列hash
介绍
Redis中的散列可以看成具有String key和String value的map容器,可以将多个key-value存储到一个key中。每一个Hash可以存储4294967295个键值对。
应用场景
例如存储、读取、修改用户属性(name,age,pwd等)。一般可以用来存某个对象的基本属性信息,例如,用户信息,商品信息等,另外,由于hash的大小在小于配置的大小的时候使用的是ziplist结构,比较节约内存,所以针对大量的数据存储可以考虑使用hash来分段存储来达到压缩数据量,节约内存的目的,例如,对于大批量的商品对应的图片地址名称。比如:商品编码固定是10位,可以选取前7位做为hash的key,后三位作为field,图片地址作为value。这样每个hash表都不超过999个,只要把redis.conf中的hash-max-ziplist-entries改为1024,即可。
- 底层实现
- ziplist
属性
- 由表头和N个entry节点和压缩列表尾部标识符zlend组成的一个连续的内存块
- 插入和删除元素的时候,都需要对内存进行一次扩展或缩减
- 更新效率低下
- 由表头和N个entry节点和压缩列表尾部标识符zlend组成的一个连续的内存块
- hashtable
属性
- 时间复杂度为O(1)
- 消耗比较多的内存空间
- 时间复杂度为O(1)
- ziplist
特性
- 存储多个键值对
操作命令
hset (hset key field value) # 给指定的key添加key-value元素 hmset (hmset key field1 value1 field2 value2)# 同时设置多个键值对数据 hget (hget key field) # 获取指定的key中filed字段 hmget (hmget key field1 field2)# 获取指定的key中指定字段的值 hsetnx (hsetnx key field value)# 如果key不存在进行插入,如果key和field都不存在不进行插入 hexists (hexists key field) # 判断指定的key中是否存在field这个字段 hlen (hlen key) # 获取指定的key中field的数量 hdel (hdel key field1 field2)# 删除指定的key中的指定字段与对应的value hgetall (hgetall key) # 获取key中所有的键值对,返回的是一个field一个value hkeys (hkeys key) # 获取指定的key中所有字段 hvals (hvals key) # 获取指定的key中所有的value hincrby (hincrby key filed count)# 给指定的key的field的字段添加或者减去count这个值 hincrbyfloat (hincrbyfloat key field value)# 给指定的字段添加浮点数的值
集合set
介绍
Redis的集合是无序不可重复的,和列表一样,在执行插入和删除和判断是否存在某元素时,效率是很高的。集合最大的优势在于可以进行交集并集差集操作。Set可包含的最大元素数量是4294967295。
应用场景
1.利用交集求共同好友。2.利用唯一性,可以统计访问网站的所有独立IP。3.好友推荐的时候根据tag求交集,大于某个threshold(临界值的)整数的有序列表可以直接使用set。可以用作某些去重功能,例如用户名不能重复等。
- 底层实现
- intset
属性
- 存储整数的有序集合
- 查找的时间复杂度为O(logN)
- 升级操作时,时间复杂度就是O(N)
- 存储整数的有序集合
- hashtable
属性
- 时间复杂度为O(1)
- 消耗比较多的内存空间
- 时间复杂度为O(1)
- intset
特性
- 不重复性
操作命令
shell sadd (sadd key value1 value2) # 添加元素 scard (scard key) # 获取成员的数量 sismember (sismember key value) # 判断是否存在value smembers (smembers key) # 获取所有的元素 spop (spop key) # 随机弹出一个元素 srandmember (srandmember key [count]) # 随机获取一个或者多个元素 srem (srem key value1 value2) # 删除一个或者多个元素,如果元素不存在则忽略 smove (smove source desition value)# 移动一个元素到指定的set中 sdiff (sdiff first-key key1 key2)# 返回给定集合之间的差集。不存在的集合key将视为空集 sdiffstore (sdiffstore destionset key1 key2)# 把获取到的差集保存到目标set中 sinter (sinter key1 key2) # 获取交集 sinterstore (sinterstore destionset key1 key2)# 把获取到的交集存储到目标set中 sunion (sunion key1 key2) # 获取并集 sunionstore (sunionstore destionset key1 key2)# 把获取到的并集存储到目标set中
有序集合sorted set
介绍
和set很像,都是字符串的集合,都不允许重复的成员出现在一个set中。他们之间差别在于有序集合中每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。尽管有序集合中的成员必须是卫衣的,但是分数(score)却可以重复。
应用场景
可以用于一个大型在线游戏的积分排行榜,每当玩家的分数发生变化时,可以执行zadd更新玩家分数(score),此后在通过zrange获取几分top ten的用户信息
- 底层实现
- ziplist
属性
- 由表头和N个entry节点和压缩列表尾部标识符zlend组成的一个连续的内存块
- 插入和删除元素的时候,都需要对内存进行一次扩展或缩减
- 更新效率低下
- 由表头和N个entry节点和压缩列表尾部标识符zlend组成的一个连续的内存块
- skiplist+dict
属性
- 跳跃表结构
- 访问时间复杂度为O(1)
- 跳跃表结构
- ziplist
特性
- 有序集合
- 查询速度快
- 有序集合
操作命令
zadd (zadd key score1 value1 score2 value2) # 添加成员 zcard (zcard key) # 计算元素个数 zincrby (zincrby key number member) # 给指定的member的分数添加或者减去number zcount (zcount key min max) # 获取分数在min和max之间的成员和数量;默认是闭区间 zrange (zrange key start stop [WITHSCORES])# 返回指定排名之间的成员(结果是分数由低到高) zrevrange (zrevrange key start stop [WITHSCORES])# 返回指定排名之间的成员(结果是分数由高到低) zrangebyscore (zrangebyscore key min max [withscores][limit offset count])# 根据分数的范围获取成员 # 按照分数:从低到高 zrevrangebyscore(zrevrangebyscore key max min [withscores][limit offset count])# 根据分数的范围获 # 取成员,按照分数:从低到高 zrank (zrank key member) # 返回一个成员的排名(从低到高的顺序) zrevrank (zrevrank key member) # 返回一个成员的排名(从高到低的顺序) zscore (zscore key member) # 获取一个成员的分数 zrem (zrem key member1 member2) # 删除指定的成员 zremrangebyrank(zremrangebyrank key start stop) # 根据排名进行删除 zremrangebyscore(zremrangebyscore key min max) # 根据分数的范围进行删除
以上是关于redis五种数据类型的主要内容,如果未能解决你的问题,请参考以下文章