下载与图形化界面
redis 3.0.504
Another-Redis-Desktop-Manager-win-1.17.1
Redis 数据类型
五种常用数据类型
Redis 存储的是 key-value 结构的数据,其中 key 是字符串类型, value 有五种常用数据类型
字符串 String
普通字符串,redis 中最简单的数据类型哈希 hash
也叫散列,类似于 java 中的 hashmap 结构列表 list
按照插入顺序排序,可以有重复元素,类似于 java 中的 linkedlist集合 set
无序集合,没有重复元素,类似 java 中的 hashset有序集合 sorted set / zset
集合中的每个元素关联一个分数(score),根据分数升序排序,没有重复元素
Redis 常用命令
字符串操作命令
设置指定 key 的值:
set key value获取指定 key 的值:
get key设置指定 key 的值,并将 key 的过期时间设为 seconds 秒:
setex key seconds value只有在 key 不存在时设置 key 的值:
setnx key value
哈希操作命令
Redis hash 是一个 string 类型的 filed 和 value 的映射表,hash 特别适合用于存储对象
将哈希表 key 中的字段 field 的值设为 value:
hset key field value获取存储在哈希表中指定字段的值:
hget key field删除存储在哈希表中的指定字段
hdel key field获取哈希表中的所有字段
hkeys key获取哈希表中所有值
hvals key
列表常用命令
Redis 列表是简单的字符串列表,按照插入顺序排序
将一个或多个插入到列表头部:
lpush key vakue1 [value2]获取列表指定范围内的元素:
lrange key start stop
返回全部元素:lrange key 0 -1移除并获取列表最后一个元素:
rpop key获取列表长度:
llen key
集合操作命令
Redis set 是 string 类型的无序集合。集合成员是唯一的,集合不能出现重复的数据
向集合添加一个或多个成员:
sadd key member1 [member2]返回集合中的所有成员:
smembers key获取集合成员数:
scard key返回给定所有集合的交集:
sinter key1 [key2]返回所有给定集合的并集:
sunion key1 [key2]删除集合中的一个或多个成员:
srem key member1 [member2]
有序集合操作命令
Redis 有序集合是 string 类型元素的集合,且不允许有重复成员,每个元素都会关联一个 double 类型的分数
向有序集合添加一个或多个成员
zadd key score1 member1 [score2 member2]通过索引区间返回有序集合中指定区间内的成员[和分数]
zrange key start stop [withscores]有序集合中对指定成员的分数加上增量 increment
zincrby key increment member移除有序集合中的一个或多个成员
zrem key member [member …]
通用命令
Redis 的通用命令是不分数据类型的,都可以使用的命令:
查找所有符合给定模式(pattern)的 key:
keyse pattern检查给定 key 是否存在:
exists key返回 key 锁储存的值的类型:
type keykey 存在时删除 key:
del key
在 java 中操作 Redis
Redis的 java客户端
Redis 的 java 客户端,常用的几种:
Jedis
Lettuce
Spring Data Redis:
是 spring 的一部分,对 Redis 底层开发包进行了高度封装。
在 spring 项目中,可以使用 Spring Data Redis 来简化操作
Spring Data Redis 使用方式
操作步骤:
- 导入 Spring Data Redis 的 maven 坐标
- 配置 Redis 数据源
- 编写配置类,创建 RedisTemplate 对象
- 通过 RedisTemplate 对象操作 Redis
Redis 相关问题
缓存击穿:指查询一个不存在的数据,mysql 查询不到数据也不会直接写入缓存,会导致每次请求都查数据库
解决方案:- 缓存空数据:查询返回的数据为空,仍把空结果进行缓存
优点:简单
缺点:消耗内存,可能发生不一致的问题 - 使用布隆过滤器:布隆过滤器使用 bitmap(位图),相当于一个以位(bit)为单位的数组,数组每个单元只存二进制数0或1
存数据:通过多个 hash 函数获取 hash 值,根据 hash 计算对应位置
查询: 使用相同的 hash 函数获取 hash 值,根据 hash 计算对应位置是否全为1
误判率:数组越小误判率越大,数组越大误判率越小,同时带来更多内存消耗
布隆过滤器实现方案:Redisson/Guava
- 缓存空数据:查询返回的数据为空,仍把空结果进行缓存
缓存击穿:给某一个 key 设置了过期时间,恰好这时间点对这个 key 有大量的并发请求,这些并发的请求可能瞬间把数据库压垮
解决方案:- 互斥锁(分布式锁):保证数据强一致性、性能差
- 逻辑过期:高可用、性能优
缓存雪崩:同一时段大量的缓存 key 同时失效或 Redis 服务器宕机,导致大量请求到达数据库,带来巨大压力
解决方案:- 给不同的 key 的 TTL 添加随机值
- 给业务增加多级缓存
- 利用 Redis 集群提高服务可用性:哨兵模式、集群模式
- 给缓存业务添加降级限流策略(可做为系统的保底策略,适用于穿透、击穿、雪崩)
Redis 合适的应用场景:
- String:缓存、技术、共享 Session
- Hash: 存对象
- List:消息队列
- Set: 兴趣标签
- ZSET: 排行榜
Redis 6.0之前为什么一直不使用多线程:
- 使用 Redis,CPU 不是瓶颈,受制于内存、网络
- 提高 Redis 性能,可用 Pipeline(命令批量处理)
- 单线程内部维护比较低
- 多线程会需要线程切换、加锁、解锁,也有可能导致死锁问题
- 惰性 Rehash(渐进式 Rehash)阻塞减少