Redis数据结构简介
对redis来说,所有的key(键)都是字符串。我们在谈基础数据结构时,讨论的是存储值的数据类型,主要包括常见的5种数据类型,分别是:String、List、Set、Zset、Hash。【相关推荐:Redis视频教程】
基础数据结构详解
String字符串
String是redis中最基本的数据类型,一个key对应一个value。
String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。
- 命令使用
- 命令执行
127.0.0.1:6379> set hello world OK 127.0.0.1:6379> get hello "world" 127.0.0.1:6379> del hello (integer) 1 127.0.0.1:6379> get hello (nil) 127.0.0.1:6379> get counter "2" 127.0.0.1:6379> incr counter (integer) 3 127.0.0.1:6379> get counter "3" 127.0.0.1:6379> incrby counter 100 (integer) 103 127.0.0.1:6379> get counter "103" 127.0.0.1:6379> decr counter (integer) 102 127.0.0.1:6379> get counter "102"
- 实战场景
- 缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。
- 计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。
- session:常见方案spring session + redis实现session共享,
List列表
Redis中的List其实就是链表(Redis用双端链表实现List)。
使用List结构,我们可以轻松地实现最新消息排队功能(比如新浪微博的TimeLine)。List的另一个应用就是消息队列,可以利用List的 PUSH 操作,将任务存放在List中,然后工作线程再用 POP 操作将任务取出进行执行。
- 命令使用
- 使用列表的技巧
- lpush+lpop=Stack(栈)
- lpush+rpop=Queue(队列)
- lpush+ltrim=Capped Collection(有限集合)
- lpush+brpop=Message Queue(消息队列)
- 命令执行
127.0.0.1:6379> lpush mylist 1 2 ll ls mem (integer) 5 127.0.0.1:6379> lrange mylist 0 -1 1) "mem" 2) "ls" 3) "ll" 4) "2" 5) "1" 127.0.0.1:6379> lindex mylist -1 "1" 127.0.0.1:6379> lindex mylist 10 # index不在 mylist 的区间范围内 (nil)
- 实战场景
- 微博TimeLine: 有人发布微博,用lpush加入时间轴,展示新的列表信息。
- 消息队列
Set集合
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
- 命令使用
其它一些集合操作,请参考这里
https://www.runoob.com/redis/redis-sets.html
- 命令执行
127.0.0.1:6379> sadd myset ycf ycf1 xiao ycf (integer) 3 127.0.0.1:6379> smember myset 1) "xiao" 2) "ycf1" 3) "ycf" 127.0.0.1:6379> sismember myset ycf (integer) 1
- 实战场景
- 标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。
- 点赞,或点踩,收藏等,可以放到set中实现
Hash散列
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
- 命令使用
- 命令执行
127.0.0.1:6379> hset user name1 ycf (integer) 1 127.0.0.1:6379> hset user email1 ycf@163.com (integer) 1 127.0.0.1:6379> hgetall user 1) "name1" 2) "ycf" 3) "email1" 4) "ycf@163.com" 127.0.0.1:6379> hget user user (nil) 127.0.0.1:6379> hget user name1 "ycf" 127.0.0.1:6379> hset user name2 xiaoycf (integer) 1 127.0.0.1:6379> hset user email2 xiaoycf@163.com (integer) 1 127.0.0.1:6379> hgetall user 1) "name1" 2) "ycf" 3) "email1" 4) "ycf@163.com" 5) "name2" 6) "xiaoycf" 7) "email2" 8) "xiaoycf@163.com"
- 实战场景
- 缓存: 能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等。
Zset有序集合
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
- 命令使用
更多命令请参考这里
https://www.runoob.com/redis/redis-sorted-sets.html
- 命令执行
127.0.0.1:6379> zadd myscoreset 100 ycf 90 xiaoycf (integer) 2 127.0.0.1:6379> ZRANGE myscoreset 0 -1 1) "xiaoycf" 2) "ycf" 127.0.0.1:6379> ZSCORE myscoreset ycf "100"
- 实战场景
- 排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。
更多编程相关知识,请访问:编程视频!!
以上就是深入聊聊Redis中的5种基本数据类型的详细内容,更多请关注自由互联其它相关文章!