目录
安装
上传安装文件
解压安装
安装Redis
修改配置
Redis服务器操作命令
Redis命令
入门
添加jar包依赖
String类型示例
Hash示例
List示例
缓存击穿与缓存穿透、缓存雪崩
缓存穿透
概念
解决方法
缓存击穿
概念
解决方案
缓存雪崩
概念
解决方法
安装
上传安装文件
解压安装
1、解压
tar -zxvf redis-5.0.5.tar.gz
2、删除安装包
rm -f redis-5.0.5.tar.gz
这一步随意
3、修改Redis文件目录名称
安装Redis
两个操作 1、make 2、 make install
修改配置
找到redis目录下的redis.conf文件,执行如下命令:
vim redis.conf
1、关闭IP绑定
2、关闭保护模式
3、开启后台启动
Redis服务器操作命令
redis-server redis.conf 默认条件下 前台启动
redis-cli -p 6379 进入客户端 exit/quit/ctrl+c 退出客户端
redis-cli -p 6379 shutdown 或者 ps -ef |grep redis kill -9 PID号 关闭redis服务器.
Redis命令
Redis里面存储类型有五种:String、List、Set、Hash、Sort Set。
下方的命令都需要进入客户端执行
1、String类型
命令 | 说明 | 案例 |
set | 添加key-value | set username admin |
get | 根据key获取数据 | get username |
strlen | 根据key获取值的长度 | strlen key |
exists | 判断key是否存在 | exists name 返回1存在 0不存在 |
del | 删除redis中的key | del key |
Keys | 用于查询符合条件的key | keys * 查询redis中全部的key keys n?me 使用占位符获取数据 keys nam* 获取nam开头的数据 |
mset | 赋值多个key-value | mset key1 value1 key2 value2 key3 value3 |
mget | 获取多个key的值 | mget key1 key2 |
append | 对某个key的值进行追加 | append key value |
type | 检查某个key的类型 | type key |
select | 切换redis数据库 | select 0-15 redis中共有16个数据库 |
flushdb | 清空单个数据库 | flushdb |
flushall | 清空全部数据库 | flushall |
incr | 自动加1 | incr key |
decr | 自动减1 | decr key |
incrby | 指定数值添加 | incrby 10 |
decrby | 指定数值减 | decrby 10 |
expire | 指定key的生效时间 单位秒 | expire key 20 key20秒后失效 |
pexpire | 指定key的失效时间 单位毫秒 | pexpire key 2000 key 2000毫秒后失效 |
ttl | 检查key的剩余存活时间 | ttl key -2数据不存在 -1该数据永不超时 |
persist | 撤销key的失效时间 | persist key |
2、Hash类型
命令 | 说明 | 案例 |
hset | 为对象添加数据 | hset key field value |
hget | 获取对象的属性值 | hget key field |
hexists | 判断对象的属性是否存在 | HEXISTS key field 1表示存在 0表示不存在 |
hdel | 删除hash中的属性 | hdel user field [field ...] |
hgetall | 获取hash全部元素和值 | HGETALL key |
hkyes | 获取hash中的所有字段 | HKEYS key |
hlen | 获取hash中所有属性的数量 | hlen key |
hmget | 获取hash里面指定字段的值 | hmget key field [field ...] |
hmset | 为hash的多个字段设定值 | hmset key field value [field value ...] |
hsetnx | 设置hash的一个字段,只有当这个字段不存在时有效 | HSETNX key field value |
hstrlen | 获取hash中指定key的值的长度 | HSTRLEN key field |
hvals | 获取hash的所有值 | HVALS user |
3、List类型
命令 | 说明 | 案例 |
lpush | 从队列的左边入队一个或多个元素 | LPUSH key value [value ...] |
rpush | 从队列的右边入队一个或多个元素 | RPUSH key value [value ...] |
lpop | 从队列的左端出队一个元素 | LPOP key |
rpop | 从队列的右端出队一个元素 | RPOP key |
lpushx | 当队列存在时从队列的左侧入队一个元素 | LPUSHX key value |
rpushx | 当队列存在时从队列的右侧入队一个元素 | RPUSHx key value |
lrange | 从列表中获取指定返回的元素 | LRANGE key start stop Lrange key 0 -1 获取全部队列的数据 |
lrem | 从存于 key 的列表里移除前 count 次出现的值为 value 的元素。 这个 count 参数通过下面几种方式影响这个操作: · count > 0: 从头往尾移除值为 value 的元素。 · count < 0: 从尾往头移除值为 value 的元素。 · count = 0: 移除所有值为 value 的元素。 | LREM list -2 “hello” 会从存于 list 的列表里移除最后两个出现的 “hello”。 需要注意的是,如果list里没有存在key就会被当作空list处理,所以当 key 不存在的时候,这个命令会返回 0。 |
Lset | 设置 index 位置的list元素的值为 value | LSET key index value |
注意:Redis的List集合为双端循环列表,两端都可以插入数据,可以当队列使用,也可以当做栈使用
队列:一端插入数据,另一端取出数据
栈:从哪端插入数据就从哪端取出数据
除了以上信息,其余内容可以去官网学习
4、事务控制
Redis中的操作可以添加事物的支持,一项任务需要多个redis命令去配合完成的话,要进行事物的控制
入门
添加jar包依赖
<!--spring整合redis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
String类型示例
setnx方法要求key不存在时才会做赋值操作,key存在时,不做修改
在赋值的同时设置超时时间,如果调用两个方法的话则丧失了操作的原子性
Hash示例
List示例
缓存击穿与缓存穿透、缓存雪崩
缓存穿透
概念
缓存穿透是指在缓存和数据库中都不存在某个数据,而用户在不停地请求这个不存在的数据,会给数据库造成很大的压力
解决方法
1、接口层增加校验,用ID做基础校验,比如说id<0的请求直接拦截
2、对于缓存和数据库都不存在的数据,可以将键值对设置为key-null,存活时间设置短一些,可以防止用户用同一个ID在短时间内发起的暴力访问。
缓存击穿
概念
缓存击穿是指在缓存中没有找到数据但是数据库中存在数据,使得高并发访问同一个数据时大量的请求直接去访问数据库,对数据库造成巨大的压力
解决方案
1、设置热点数据永不过期
2、后台设置一个定时任务,定时的刷新缓存中的数据
3、检查更新
4、加锁
- 在获取数据的方法上加锁,可以避免大量请求同时去获取数据,可以避免缓存击穿,但是在数据正常存在时,由于加锁的缘故使得效率较低
- 在从数据库获取数据的代码上加锁,在缓存正常时不会影响效率,但是缓存失效后,请求还是会访问数据库,由于有锁,会造成阻塞
- 在从数据库获取数据的代码上加锁,但是在访问数据库之前要求在访问一次缓存,双重判断,在第一个请求访问数据库后,后续请求虽然还是阻塞状态,但是会从缓存中获得数据
- 用互斥锁解决上面的问题
缓存雪崩
概念
缓存雪崩是指缓存中的数据的key值在某一个时间段大量过期,导致请求都去访问数据库,造成数据库的压力过大。
与缓存击穿的区别在于:缓存击穿是大量请求访问同一个数据
缓存雪崩是大量不同请求访问不同的数据
不过两者都是要去访问数据库。
解决方法
1、设置热点数据永不过期
2、将数据的过期时间错开设置,可以设置为随机值,防止大量的key在同一个时间过期
3、分布式部署的话可以将不同的热点数据布置在不同的缓存中