概述:
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的,使用C语言编写的,支持网络交互的,内存中的Key-Value数据结构存储系统,支持多种语言,它可以用作数据库、缓存和消息中间件。
Redis 与其他 key - value 缓存产品有以下三个特点:
1.Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
2.Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
3.Redis支持数据的备份,即master-slave(主-从)模式的数据备份。
Redis 优势
1.性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
2.丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
3.原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
4.丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
为什么使用Redis?
关系型数据库
采用关系模型来组织数据的数据库,关系模型就是二维表格模型。一张二维表的表名就是关
系,二维表中的一行就是一条记录,二维表中的一列就是一个字段。
优点:
1.容易理解
2.使用方便,通用的sql语言
3.易于维护,丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大降低了数据冗余和数据不一致的概率缺点
缺点:
1.磁盘I/O是并发的瓶颈
2.海量数据查询效率低
3.横向扩展困难,无法简单的通过添加硬件和服务节点来扩展性能和负载能力,当需要对数据库进行升级和扩展时,需要停机维护和数据迁移。
4.多表的关联查询以及复杂的数据分析类型的复杂sql查询,性能欠佳。因为要保证ACID。
非关系型数据库
非关系型,分布式,一般不保证遵循ACID原则的数据存储系统。键值对存储,结构不固定。
优点
结构简单易扩展
高性能
灵活的数据模型
缺点
只适合存储一些较为简单的数据
不适合复杂查询的数据
不适合持久存储海量数据
Linux下安装Redis:
1.下载:https://redis.io/download
wget https://download.redis.io/releases/redis-6.2.4.tar.gz
或者 上传
2.解压:tar -zxvf redis-6.0.8.tar.gz
3.make:本地编译源码
4.mkdir -p /opt/redis:创建文件
5.make install PREFIX=/opt/redis:安装到指定目录
6.cd /opt/redis/bin:进入安装文件bin目录
7. ./redis-server 启动服务
redis基本设置:
1. 从redis的源码目录中复制 redis.conf 到 redis 的安装目录,
进入到redis源码包 redis-6.0.8 里面有个redis.conf的配置文件
cp redis.conf /opt/redis/bin/
2.文件内搜索 :vim redis.conf
在命令模式下 /搜索的内容 回车
3.设置redis服务启动后,处于后台运行,这样就不影响我们正常的其他操作。
daemonize no 改为 daemonize yes.
4.设置远程访问,注释 绑定的id,默认只能本机访问,这样就可可以远程访问了。
5.为redis设置连接密码
requirepass 你的密码
启动命令:./redis-server redis.conf
查看Redis运行状态:ps -ef | grep redis
进入客户端模式:./redis-cli
输入密码:auth 密码
测试:ping
ctrl+c退出客户端模式
Redis数据类型:
5种基本常用类型:
string(字符串) hash(哈希) list(列表)set(集合 ) zset(sorted set:有序集合)
String(字符串):
string 是 redis 最基本的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
单值缓存
set key value
get key
del key
keys *
对象缓存(不对对象中数据操作时可以使用)
set user:1 value(json格式数据)
计数器
set news_views:1 0 设置文章访问量
incr news_views:1 文章访问量+1
decr news_views:1 文章访问量-1
get news_views:1 获得值
Web集群session共享
session + redis 实现session共享
Hash(哈希)
redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象(对对
象中的数据发生修改情况)。
存的是字符串和字符串值之间的映射,比如要存储用户购物车等信息。
hset key field value 存储一个哈希表key的键值
hmset key field value [field value …] 存储多个键值对
hget key field 获取哈希表key对应的field键值
hmget key field [field …] 批量获取哈希表key中多个field键值
hdel key field [field …] 删除哈希表key中的field键值
hlen key 返回哈希表key中的field的数量
hgetall key 返回哈希表key中所有的键值
hincrby key field 增加的值(减少给负数)
List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左
边)或者尾部(右边)。
lpush key value[value...] 将一个或多个值插入到key列表的表头(最左边)
rpush key value[value...] 将一个或多个值插入到key列表的表尾(最右边)
lpop key 移除并返回key列表的头元素
rpop key 移除并返回key列表的尾元素
lrange key start stop 返回列表key中指定区间内的元素,区间以偏移量start和stop
常见用法
Stack= LPUSH + LPOP =FILO
Queue= LPUSH + RPOP
使用场景:可以用来存储接收到的消息数据。
Set(集合)
Redis 的 Set 是无序不重复集合。
sadd key member[member...] 往集合key中存入元素,元素存在则忽略,key不存在则新建
srem key member[member...] 从集合key中删除元素
smembers key 获取集合key中所有元素
scard key 获取集合key的元素个数
Zset(sorted set:有序集合)
redis zset 也是不允许重复的成员,但是是有序的。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进
行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zadd key score member[[score member]..] 往有序集合key中加入带分值元素
zrem key member[member...] 从有序集合key中删除元素
zscore key member 返回有序集合key中元素member的分值
zincrby key increment member 为有序集合key中元素member的分值加上increment
zcard key 返回有序集合key中元素个数
zrange key start stop[withscores] 正序获取有序集合keyastart下标到stop下标的元素
使用场景:记录微信朋友圈记录点赞用户
设置失效时间
有时候我们并不希望redis的key一直存在。例如缓存,验证码等数据,我们希望它们能在一定时间内自动的被销毁。redis提供了一些命令,能够让我们对key设置过期时间,并且让key过期之后被自动删除。
1.设置值时直接设置有效时间:
EX 表示以秒为单位
PX表示以毫秒为单位 EX,PX不区分大小写
set name jim EX 30 设置失效时间为30秒
ttl 键 查看剩余时间(秒)
pttl 键 查看剩余时间(毫秒)
2.设置值后设置有效时间:
expire 键 时间(秒)
pexpire 键 时间(毫秒)
SpringBoot集成使用Redis
概述:
Jedis是Redis官方推出的一款面向Java的客户端,提供了很多接口供Java语言调用。可以在Redis官网下载。Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作。
spring-data-redis针对jedis提供了如下功能:
1.连接池自动管理,提供了一个高度封装的“RedisTemplate”类.
2.针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口.
ValueOperations:简单K-V操作
SetOperations:set类型数据操作
ZSetOperations:zset类型数据操作
HashOperations:针对map类型的数据操作
ListOperations:针对list类型的数据操作
3.将事务操作封装,有容器控制。
4.针对数据的“序列化/反序列化”,提供了多种可选择策略(RedisSerializer)
JdkSerializationRedisSerializer:POJO对象的存取场景,使用JDK本身序列化机制.
StringRedisSerializer:Key或者value为字符串的场景,根据指定的charset对数据的字节序列编码成string,是“new String(bytes, charset)”和“string.getBytes(charset)”的直接封装。是最轻量级和高效的策略。
JacksonJsonRedisSerializer:jackson-json工具提供了javabean与json之间的转换能力,可以将pojo实例序列化成json格式存储在redis中,也可以将json格式的数据转换成pojo实例。
搭建:
1.添加redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置连接redis
spring:
redis:
host: 192.168.31.100
port: 6379
password: 111
database: 0
pool:
max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 8 # 连接池中的最大空闲连接
min-idle: 0 # 连接池中的最小空闲连接
timeout: 5000ms # 连接超时时间(毫秒)
3.注入RedisTemplate
@Autowired
RedisTemplate redisTemplate;
4.测试
redisTemplate.opsForValue().set("name", "aa");
redisTemplate.opsForValue().set("users", users,10*1000, TimeUnit.MILLISECONDS);
redisTemplate.hasKey("name");
redisTemplate.opsForValue().get("name");
redisTemplate.delete("users");
Redis线程模型
Redis 持久化
概述:
Redis 事务:
主从复制:
2.主机配置
bind 0.0.0.0 #任何 ip 都可以访问
daemonize yes 后台运行
pidfile /var/run/redis_6379.pid #进程号文件
logfile "6379.log" #日志文件 注意文件名修改只是为了区分
dbfilename dump6379.rdb #数据文件
requirepass root #主机密码
3.从机配置
#bind 注释
daemonize yes 后台运行
pidfile /var/run/redis_6380.pid #进程号文件
logfile "6380.log" #日志文件 注意文件名修改只是为了区分
dbfilename dump6380.rdb #数据文件
replicaof <masterip>主机 ip <masterport>主机端口
masterauth <master-password>主机密码
从机进入客户端模式 ./redis-cli -p 从机端口
从机:
测试主写从读
哨兵机制
概述:
哨兵模式是一种特殊的模式,首先 Redis 提供了哨兵的命令,哨兵是一个独立的进程,作为
进程,它会独立运行。其原理是哨兵通过发送命令,等待 Redis 服务器响应,从而监控运行的多个
Redis 实例。
单哨兵
哨兵集群
Key 过期策略
缓存穿透、缓存击穿、缓存雪崩
缓存穿透
缓存雪崩
缓存雪崩是指,在高并发情况下,大量的缓存失效,或者缓存层出现故障。于是所有的请求都会
达到数据库,数据库的调用量会暴增,造成数据库也会挂掉的情况。
对于“Redis 宕机,请求全部走数据库”这种情况,我们可以有以下的思路: