努力最大的意义在于谋求更多的选择权,储蓄更多的安全感,让内心不失控,生活不失序。
文章标记颜色说明:
- 黄色:重要标题
- 红色:用来标记结论
- 绿色:用来标记一级论点
- 蓝色:用来标记二级论点
1 redis介绍
- 远程字典服务:Redis是「Remote Dictionary Service」的首字母缩写
- 中间件:Redis 是互联网技术领域使用最为广泛的存储中间件
1.1 优势:
- 超高的性能
- 完美的文档
- 简洁易懂的源码
- 丰富的客户端库支持
1.2 使用情况:
redis在开源中间件领域广受好评。
国内外很多大型互联网 公司都在使用 Redis,比如 Twitter、YouPorn、暴雪娱乐、Github、StackOverflow、腾讯、 阿里、京东、华为、新浪微博等等,很多中小型公司也都有应用。
可以说,对 Redis 的了解和应用实践是中高级后端开发者的必备技能。
1.3 安装
- 网页版redis Try Redis
- 直接安装 yum
- github源码编译
- docker安装
以上多种方式可以进行安装,现在介绍使用docker的安装方式
# 拉取 redis 镜像 docker pull redis # 运行 redis 容器 docker run --name redis -d -p6379:6379 redis # 执行容器中的 redis-cli,可以直接使用命令行操作 redis docker exec -it redis redis-cli
安装成功,可以看到:
进入容器之后,可以看到
2 基本数据类型
基本数据类型有5种,如下:
- String
- Hash
- List
- Set
- ZSet
2.1 String
- 是最基本的数据类型
- key-value 一一对应
- 最大储存值未512MB
- 动态字符串,可修改
类型:字符串,整数,浮点数
使用:可做简单的键值对缓存
使用场景:缓存,限流,计数器,分布式锁,分布式Session
常用命令:
set: set key value #设置key-value get: get key #获取值 incr: incr key #自增,value 为数字时,生效 decr: decr key #自减,value 为数字时,生效 mget: mget key1 key2 #一次性获取多个值
set:往redis里面输入Key-Value,比如:set name test,Value值为:test
get:输入key值,可返回value值
127.0.0.1:6379> set name test OK 127.0.0.1:6379> get name "test"
inc:自增1
decr:自减1
127.0.0.1:6379> set num 1 OK 127.0.0.1:6379> get num "1" 127.0.0.1:6379> incr num (integer) 2 127.0.0.1:6379> get num "2" 127.0.0.1:6379> decr num (integer) 1 127.0.0.1:6379> get num "1" 127.0.0.1:6379> mget name num 1) "test" 2) "1"
mget:一次获取多value值
127.0.0.1:6379> mget name num 1) "test" 2) "1"
2.2 Hash-字典
- 无序字典
- 数组+链表二位结构
- 字典的值只能是字符串
- 渐进式rehash策略
Redis 的字典相当于 Java 语言里面的 HashMap,它是无序字典。
内部实现结构上同 Java 的 HashMap 是一致的,同样的数组 + 链表二维结构。第一维 hash 的数组位置碰撞 时,就会将碰撞的元素使用链表串接起来。
**渐进式 **rehash :
- 在 rehash 的同时,保留新旧两个 hash 结构,
- 查询时会同时查询两个 hash 结构,在后续的定时任务中以及 hash 的子指令中,循序渐进地将旧 hash 的内容 一点点迁移到新的 hash 结构中
- 当 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
127.0.0.1:6379> hset testhash name1 python1 (integer) 1 127.0.0.1:6379> hset testhash name2 pytho2 (integer) 1 127.0.0.1:6379> hset testhash name3 pytho3 (integer) 1 127.0.0.1:6379>
hget
127.0.0.1:6379> hget testhash name3 "pytho3" 127.0.0.1:6379>
hmget
127.0.0.1:6379> hmget testhash name1 name2 name3 1) "python1" 2) "pytho2" 3) "pytho3" 127.0.0.1:6379>
2.3 List-列表
Redis 的列表相当于Java 语言里面的 LinkedList,是链表而不是数组。
list 的插入和删除操作非常快,时间复杂度为 O(1)
但是索引定位很慢,时间复杂度为 O(n),这点让人非常意外。
场景:
Redis 的列表结构常用来做异步队列使用。
将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理。
简单队列,堆,栈相关业务场景
常用命令:
lpush: lpush lpush key element [element ...] #从列表List的最左边插入一个元素 lpop: lpop key #从列表List的左边移出一个元素 rpush: #从列表List的右边插入一个元素 rpop: rpop key [count] #从列表List的右边移出一个元素 llen: llen key #打印当前列表List的元素个数
lpush:
127.0.0.1:6379> lpush list1 java (integer) 1 127.0.0.1:6379> lpush list1 python (integer) 2 127.0.0.1:6379> lpush list1 ja (integer) 3 127.0.0.1:6379> lpush list1 js (integer) 4 127.0.0.1:6379>
lpop,llen,rpop
127.0.0.1:6379> lpop list1 1 1) "js" 127.0.0.1:6379> llen list1 (integer) 3 127.0.0.1:6379> rpop list1 "java" 127.0.0.1:6379> llen list1 (integer) 2 127.0.0.1:6379>
2.4 Set
- 键值对:是无序/唯一
Redis 的集合相当于 Java 语言里面的 HashSet,它内部的键值对是无序的唯一的。
它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值 NULL。
当集合中最后一个元素移除之后,数据结构自动删除,内存被回收。
set 结构适合数据不允许重复的业务场景,
例如:可以用来存储活动中奖的用户 ID,因为有去重功能,可以保证同一个用户不会中奖两次。
使用场景:赞,踩,标签,好友关系,好友推荐,唯一属性的相关业务
常用命令:
sadd: sadd key member [member ...] #往set中添加数据 srem: #从set中删除数据 scard: #查看set中存在的元素个数 sismember: #查看set中是否存在某个数据
使用方法:
2.5 zset
zset 可以说是 Redis 提供的特色的数据结构,它也是在面试中面试官最爱问的数据结
构。
它类似于 Java 的 SortedSet 和 HashMap 的结合体,
- 它是一个 set,保证了内部 value 的唯一性,
- 它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。
它的内部实现用的是一种叫着「跳跃列表」的数据结构。
(类似有序的set)
使用场景:排行榜
常用命令:
zadd: zadd key [NX|XX] [GT|LT] [CH] [INCR] score member #添加数据 zrem: zrem key member [member ...] #删除元素 zcard: zcard key #查询数据 zrange: zrange key start stop [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES] #数据排序,根据分数从大到小 zrevrange: zrevrange key start stop [WITHSCORES] #数据排序,分数从大到小
简单实用示例:
127.0.0.1:6379> zadd book 1 java (integer) 1 127.0.0.1:6379> zadd book 3 python (integer) 1 127.0.0.1:6379> zadd book 2 js (integer) 1 127.0.0.1:6379> zcard book (integer) 3 127.0.0.1:6379> zrange book 0 3 withscores 1) "java" 2) "1" 3) "js" 4) "2" 5) "python" 6) "3" 127.0.0.1:6379> zrevrange book 0 3 withscores 1) "python" 2) "3" 3) "js" 4) "2" 5) "java" 6) "1" 127.0.0.1:6379>
版权归原作者 颜淡慕潇 所有, 如有侵权,请联系我们删除。