飞道的博客

【Redis|1】Redis基本数据类型及其常用命令

380人阅读  评论(0)

目录

 1 redis介绍

1.1 优势:

1.2 使用情况:

1.3 安装

2 基本数据类型

 2.1 String

2.2 Hash-字典

2.3 List-列表

2.4 Set

2.5 zset

努力最大的意义在于谋求更多的选择权,储蓄更多的安全感,让内心不失控,生活不失序。

文章标记颜色说明:

  • 黄色:重要标题
  • 红色:用来标记结论
  • 绿色:用来标记一级论点
  • 蓝色:用来标记二级论点

 1 redis介绍

  • 远程字典服务:Redis是「Remote Dictionary Service」的首字母缩写
  • 中间件:Redis 是互联网技术领域使用最为广泛的存储中间件

1.1 优势:

  • 超高的性能
  • 完美的文档
  • 简洁易懂的源码
  • 丰富的客户端库支持

1.2 使用情况:

redis在开源中间件领域广受好评。

国内外很多大型互联网 公司都在使用 Redis,比如 TwitterYouPorn、暴雪娱乐、GithubStackOverflow、腾讯、 阿里、京东、华为、新浪微博等等,很多中小型公司也都有应用。

可以说,对 Redis 的了解和应用实践是中高级后端开发者的必备技能。

1.3 安装

  • 网页版redis Try Redis
  • 直接安装 yum
  • github源码编译 
  • docker安装

以上多种方式可以进行安装,现在介绍使用docker的安装方式


   
  1. # 拉取 redis 镜像
  2. docker pull redis
  3. # 运行 redis 容器
  4. docker run --name redis -d - p6379: 6379 redis
  5. # 执行容器中的 redis-cli,可以直接使用命令行操作 redis
  6. docker exec -it redis redis-cli

安装成功,可以看到:

进入容器之后,可以看到

2 基本数据类型

基本数据类型有5种,如下:

  • String
  • Hash
  • List
  • Set
  • ZSet

 2.1 String

  • 是最基本的数据类型
  • key-value 一一对应
  • 最大储存值未512MB
  • 动态字符串,可修改

类型:字符串,整数,浮点数

使用:可做简单的键值对缓存

使用场景:缓存,限流,计数器,分布式锁,分布式Session

常用命令: 


   
  1. set: set key value #设置key-value
  2. get: get key #获取值
  3. incr: incr key #自增,value 为数字时,生效
  4. decr: decr key #自减,value 为数字时,生效
  5. mget: mget key1 key2 #一次性获取多个值

set:往redis里面输入Key-Value,比如:set name test,Value值为:test

get:输入key值,可返回value值


   
  1. 127.0.0.1:6379> set name test
  2. OK
  3. 127.0.0.1:6379> get name
  4. "test"

inc:自增1

decr:自减1


   
  1. 127.0.0.1:6379> set num 1
  2. OK
  3. 127.0.0.1:6379> get num
  4. "1"
  5. 127.0.0.1:6379> incr num
  6. (integer) 2
  7. 127.0.0.1:6379> get num
  8. "2"
  9. 127.0.0.1:6379> decr num
  10. (integer) 1
  11. 127.0.0.1:6379> get num
  12. "1"
  13. 127.0.0.1:6379> mget name num
  14. 1) "test"
  15. 2) "1"

 mget:一次获取多value值


   
  1. 127.0.0.1:6379> mget name num
  2. 1) "test"
  3. 2) "1"

2.2 Hash-字典

  • 无序字典
  • 数组+链表二位结构
  • 字典的值只能是字符串
  • 渐进式rehash策略

Redis 的字典相当于 Java 语言里面的 HashMap,它是无序字典

内部实现结构上同 Java 的 HashMap 是一致的,同样的数组 + 链表二维结构。第一维 hash 的数组位置碰撞 时,就会将碰撞的元素使用链表串接起来。

渐进式 rehash

  1. rehash 的同时,保留新旧两个 hash 结构
  2. 查询时会同时查询两个 hash 结构,在后续的定时任务中以及 hash 的子指令中,循序渐进地将旧 hash 的内容 一点点迁移到新的 hash 结构中
  3. hash 移除了最后一个元素之后,该数据结构自动被删除,内存被回收

使用场景:储存用户信息,用户主页访问量,组合查询 

常用命令

  • hset:往hash里,添加key-value
  • hget:通过key值,从hash里取对应的value
  • hmget:一次性获取多个key的value

 hset 格式:

127.0.0.1:6379> hset key field value [field value ...]

hset


   
  1. 127.0.0.1:6379> hset testhash name1 python1
  2. (integer) 1
  3. 127.0.0.1:6379> hset testhash name2 pytho2
  4. (integer) 1
  5. 127.0.0.1:6379> hset testhash name3 pytho3
  6. (integer) 1
  7. 127.0.0.1:6379>

hget


   
  1. 127.0.0.1:6379> hget testhash name3
  2. "pytho3"
  3. 127.0.0.1:6379>

hmget


   
  1. 127.0.0.1:6379> hmget testhash name1 name2 name3
  2. 1) "python1"
  3. 2) "pytho2"
  4. 3) "pytho3"
  5. 127.0.0.1:6379>

2.3 List-列表

Redis 的列表相当于 Java 语言里面的 LinkedList是链表而不是数组

list 的插入和删除操作非常快,时间复杂度为 O(1)

但是索引定位很慢,时间复杂度为 O(n),这点让人非常意外。

场景:

Redis 的列表结构常用来做异步队列使用。

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

简单队列,堆,栈相关业务场景

常用命令:


   
  1. lpush: lpush lpush key element [element ...] #从列表List的最左边插入一个元素
  2. lpop: lpop key #从列表List的左边移出一个元素
  3. rpush: #从列表List的右边插入一个元素
  4. rpop: rpop key [count] #从列表List的右边移出一个元素
  5. llen: llen key #打印当前列表List的元素个数

lpush:


   
  1. 127.0.0.1:6379> lpush list1 java
  2. (integer) 1
  3. 127.0.0.1:6379> lpush list1 python
  4. (integer) 2
  5. 127.0.0.1:6379> lpush list1 ja
  6. (integer) 3
  7. 127.0.0.1:6379> lpush list1 js
  8. (integer) 4
  9. 127.0.0.1:6379>

lpop,llen,rpop


   
  1. 127.0.0.1:6379> lpop list1 1
  2. 1) "js"
  3. 127.0.0.1:6379> llen list1
  4. (integer) 3
  5. 127.0.0.1:6379> rpop list1
  6. "java"
  7. 127.0.0.1:6379> llen list1
  8. (integer) 2
  9. 127.0.0.1:6379>

2.4 Set

  • 键值对:是无序/唯一

Redis 的集合相当于 Java 语言里面的 HashSet,它内部的键值对是无序的唯一的。

它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值 NULL

当集合中最后一个元素移除之后,数据结构自动删除,内存被回收。
set 结构适合数据不允许重复的业务场景
例如:可以用来存储活动中奖的用户 ID ,因为有去重功能,可以保证同一个用户不会中奖两次。

使用场景:赞,踩,标签,好友关系,好友推荐,唯一属性的相关业务 

常用命令:


   
  1. sadd: sadd key member [member ...] #往set中添加数据
  2. srem: #从set中删除数据
  3. scard: #查看set中存在的元素个数
  4. sismember: #查看set中是否存在某个数据

使用方法:

2.5 zset

zset 可以说Redis 提供的特色的数据结构,它也是在面试中面试官最爱问的数据结

构。
它类似于 Java SortedSet HashMap 的结合体,
  • 它是一个 set,保证了内部 value 的唯一性,
  • 它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。
它的内部实现用的是一种叫着「跳跃列表」的数据结构。

(类似有序的set)

使用场景:排行榜 

常用命令:


   
  1. zadd: zadd key [ NX| XX] [GT| LT] [ CH] [ INCR] score member #添加数据
  2. zrem: zrem key member [member ...] #删除元素
  3. zcard: zcard key #查询数据
  4. zrange: zrange key start stop [ BYSCORE| BYLEX] [REV] [LIMIT offset count] [WITHSCORES] #数据排序,根据分数从大到小
  5. zrevrange: zrevrange key start stop [WITHSCORES] #数据排序,分数从大到小

简单实用示例:


   
  1. 127.0.0.1:6379> zadd book 1 java
  2. (integer) 1
  3. 127.0.0.1:6379> zadd book 3 python
  4. (integer) 1
  5. 127.0.0.1:6379> zadd book 2 js
  6. (integer) 1
  7. 127.0.0.1:6379> zcard book
  8. (integer) 3
  9. 127.0.0.1:6379> zrange book 0 3 withscores
  10. 1) "java"
  11. 2) "1"
  12. 3) "js"
  13. 4) "2"
  14. 5) "python"
  15. 6) "3"
  16. 127.0.0.1:6379> zrevrange book 0 3 withscores
  17. 1) "python"
  18. 2) "3"
  19. 3) "js"
  20. 4) "2"
  21. 5) "java"
  22. 6) "1"
  23. 127.0.0.1:6379>


转载:https://blog.csdn.net/weixin_36755535/article/details/128903117
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场