![bb5d10173fd0540e172c6eb71203ad69.png](https://i-blog.csdnimg.cn/blog_migrate/608e48bec223960b73bd82ea9ea358fa.jpeg)
主要内容
- Redis简介
- 使用Redis作为缓存工具时流程
- Redis单机版安装
- Redis数据类型
- Redis持久化策略
- Redis主从复制
- 哨兵(Sentinel)
- Redis集群(Cluster)
- Jedis
配套视频教程:Redis精品实战教程
一、 Redis简介
1、NoSQL简介
目前市场主流数据存储都是使用关系型数据库。每次操作关系型数据库时都是I/O操作,I/O操作是主要影响程序执行性能原因之一,连接数据库关闭数据库都是消耗性能的过程。关系型数据库索引数据结构都是树状结构,当数据量特别大时,导致树深度比较深,当深度深时查询性能会大大降低。尽量减少对数据库的操作,能够明显的提升程序运行效率。
针对上面的问题,市场上就出现了各种NoSQL(Not Only SQL,不仅仅可以使用关系型数据库)数据库,它们的宣传口号:不是什么样的场景都必须使用关系型数据库,一些特定的场景使用NoSQL数据库更好。
常见NoSQL数据库:
- memcached:键值对,内存型数据库,所有数据都在内存中。
- Redis:和Memcached类似,还具备持久化能力。
- HBase:以列作为存储。
- MongoDB:以Document做存储。
2 Redis简介
Redis是以Key-Value形式进行存储的NoSQL数据库。
Redis是使用C语言进行编写的。
平时操作的数据都在内存中,效率特高,读的效率110000/s,写81000/s,所以多把Redis当做缓存工具使用(在一些框架中还把Redis当做临时数据存储工具)。缓存工具:把数据库中数据缓存到Redis中,由于Redis读写性能较好,访问Redis中数据,而不是频繁访问数据库中数据。
Redis以solt(槽)作为数据存储单元,每个槽中可以存储N多个键值对。Redis中固定具有16384。理论上可以实现一个槽是一个Redis。每个向Redis存储数据的key都会进行crc16算法得出一个值后对16384取余就是这个key存放的solt位置。
同时通过Redis Sentinel(哨兵)提供高可用,通过Redis Cluster(集群)提供自动分区。
二、 使用Redis作为缓存工具时流程(写代码时思路)(边路缓存思想中一部分)
1、应用程序向Redis查询数据
2、判断Key是否存在
3、是否存在
1) 存在
- 把结果查询出来
- 返回数据给应用程序
2) 不存在
- 向MySQL查询数据
- 把数据返回给应用程序
- 把结果缓存到Redis中
![0082c96c86e3df69e06598547ba6ef8e.png](https://i-blog.csdnimg.cn/blog_migrate/96c3726b2fbd878b834854ba41c4d3c4.jpeg)
三、 基于Docker安装Redis单机版
1 拉取镜像
docker pull redis:5.0.5 |
1 创建并启动容器
docker run -d --name redis -p 6379:6379 --restart always redis:5.0.5 |
2 客户端测试
docker exec -it redis bash |
在任意目录在输入redis-cli 即可进入redis命令行。
四、 Redis数据类型(面试问题)
Redis中数据是key-value形式。不同类型Value是有不同的命令进行操作。key和value都支持下面类型(在代码中多把key设置为String类型):
- String 字符串
- Hash 哈希表
- List 列表
- Set 集合
- Sorted Set 有序集合
Redis中命令有很多,抽取出部分进行讲解。
1、Key操作
1.1 exists
判断key是否存在。
- 语法:exists key名称
- 返回值:存在返回数字,不存在返回0
1.2 expire
设置key的过期时间,单位秒
- 语法:expire key 秒数
- 返回值:成功返回1,失败返回0
1.3 ttl
查看key的剩余过期时间
- 语法:ttl key
- 返回值:返回剩余时间,如果不过期返回-1
1.4 del
根据key删除键值对。
- 语法:del key
- 返回值:被删除key的数量
1.5 keys
命令: keys *
查看所有存在的key
2、字符串值(String)
2.1 set
设置指定key的值。如果key不存在是新增效果,如果key存在是修改效果。键值对是永久存在的。
- 语法:set key value
- 返回值:成功OK
2.2 get
获取指定key的值
- 语法: