Redis
Redis 命令
Redis 命令
set命令 get命令
然后就是选择redis的库用到了select 0-15总共16个库
Redis数据结构介绍
基本类型:String Hash List Set SortedSet
特殊类型:GEO(地理坐标) BitMap HyperMap(字符串)
Redis的通用命令
- KEYS 查询符合模板的所有KEY 不建议在生产环境设备上使用 因为redis是单线程的 然后这个查询可能耗费时间比较长 所以在这段时间内会阻塞
- DEL 删除指定的KEY
- EXISTS 查看KEY是否存在
- EXPIRE 给KEY设置一个有效期 有效期到期 KEY就会自动删除
- TTL 查看一个KEY的剩余有效期 -2代表不存在了 -1代表永久有效
String类型
是redis中最简单的数据类型 字符串类型最大空间不能超过512M
- SET 添加或者修改已经存在的一个String类型的键值对
- GET 根据KEY获取String类型的value
- MSET 批量添加多个String类型的键值对
- MGET 批量根据多个key得到value
- INCR 让一个整型的key自增1
- INCRBY 让一个整型的key自增并指定步长 例如 incrby num 2 让num自增2
- INCRBYFLOAT 让一个浮点型的数字自增并指定步长
- SETNX 添加一个String类型的键值对 前提是这个key不存在 否则不执行
- SETEX 添加一个String类型的键值对 并且指定有效期
KEY的结构
Redis中的key允许有多个单词构成层级结构 多个单词之间用:隔开 比如项目名:业务名:类型:id
这个格式并非固定 如果项目名叫itheima 然后一个业务是user 一个业务是product 那么两个同样的id就可以定义为itheima:user:1和itheima:product:1从而达到相同的id因为层级关系的不同 存储结果不同
Hash
也叫散列 其value是一个无序字典 类似于Java中的HashMap结构 如果写成json字符串 会很难修改
- HSET key field value 添加或修改hash类型key的field的值
- HGET key field 获取一个hash类型key的field的值
- HMSET 批量添加多个hash类型key的field的值
- HMGET 批量获取多个hash类型的key的field的值
- HGETALL 获取一个hash类型的key中的所有的field和value
- HVALS 获取一个hash类型的key中的所有的value
- HKEYS 获取一个hash类型的key中的所有的field
- HINCRBY 让一个hash类型的key自增并指定补偿
- HSETNX 添加一个hash类型的key的值 如果这个field存在 则不执行
List
简介
redis中的list和Java中的linkedlist类似 是一个双向链表结构 既可以正向检索也可以支持反向检索
既然和linkedlist类似 那么特征如下
- 有序
- 元素可以重复
- 插入删除较快
- 查询速度一般
常用来存储一个有序列表 比如朋友圈点赞列表 评论列表等
list常见命令
-
LPUSH key element... 向列表左侧插入一个或多个元素
-
LPOP key 移除并返回列表左侧的第一个元素 没有则返回nil
-
RPUSH key element... 向列表右侧插入一个或多个元素
-
RPOP key 移除并返回列表右侧的第一个元素
-
LRANGE key star end 返回一段角标范围内的所有元素
-
BLPOP和BRPOP 和LPOP和RPOP类似 只不过在没有元素时等待指定时间 而不是直接返回nil
用list模拟一个栈
入口和出口在同一边 也就是LPOP和LPUSH
用list模拟一个队列
入口和出口在不同边 也就是LPUSH和RPOP或者反过来
用list模拟一个阻塞队列
首先保证是队列 入口出口在不同边 然后用BLPUSH和BRPOP 等待获取
Set
简介
redis中的set结构和java中的HashSet类似 可以看成是value为null的HashMap
特征如下
- 无序
- 元素不可重复
- 查找快
- 支持交集并集差集等功能
常见命令
- SADD key member... 向set中添加一个或多个元素
- SREM key member... 移除set中的指定元素
- SCARD key 返回set中元素的个数
- SISMENBER key member... 判断一个元素是否存在于set中
- SMEMBERS 获取set中的所有元素
- SINTER key1 key2... 求key1和key2的交集
- SDIFF key1 key2... 求key1-key2的集合
- SUNION key1 key2... 求key1和key2的并集
SortedSet
简介
redis中的SortedSet同样也是set 但是可排序 类似于java中的TreeSet 但是底层实现是不一样的 SortedSet中的每个元素都有score属性 然后就可以根据这个score来排序 底层实现是一个调表(SkipList)加上hash表
特性
- 可排序
- 元素不重复
- 查询速度快
常见命令
- ZADD key score member... 添加一个或者多个元素到SortedSet中 如果已经存在则更新score值
- ZREM key member 移除SortedSet中的指定元素
- ZSCORE key member 得到SortedSet中指定元素的score值
- ZRANK key member 获取SortedSet中的指定的元素排名
- ZCARD key 获取SortedSet的个数
- ZCOUNT key min max 统计分数在指定范围内的所有元素个数
- ZINCRBY key increment member 让SortedSet中指定元素按照步长去自增
- ZRANGE key min max 按照score排序后获取指定排名范围内的元素
- ZRANGEBYSCORE key min max 按照score排序后 获取指定score范围内的元素
- ZDIFF ZINTER ZUNION 求差集 交集 并集
排序都是升序排名 如果要降序排名 在排序的命令Z后面加上REV即可
redis的java客户端
客户端对比
jedis客户端
使用jedis
- 引入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>6.0.0</version>
</dependency>
- 建立连接
@BeforeEach
void setUp() {
// 建立链接
jedis = new Jedis("192.168.88.130",6379);
jedis.auth("123456");
jedis.select(0);
}
建立完连接之后就可以开始测试了 jedis客户端中的命令是跟redis是一样的 所以不需要其他的api 直接使用jedis.redis命令即可
还需要做的就是关闭连接 @AfterEach void tearDown() { if(jedis != null) { jedis.close(); } }
jedis连接池
其实就是建一个工厂类 定义静态常量对象 然后通过静态块来配置 最后通过一个静态方法得到Jedis连接

然后建立连接直接通过Jedis jedis = JedisConnectionFactory得到即可
SpringDataRedis
介绍
SpringData是spring中数据操作的模块 对各种数据库的集成 其中对redis的集成模块叫做SpringDataRedis
该特点为
- 提供了对不同redis客户端的整合(lettuce和jedis)
- 提供了RedisTemplete来统一API操作Redis
- 支持Redis的发布订阅模型
- 支持Redis哨兵和Redis集群
- 支持基于lettuce的响应式编程
- 支持基于JDK JSON 字符串 spring对象的数据序列化及反序列化
- 支持基于Redis的JDKCollection的实现 就是对栈 队列 数组集合的又一次实现 方便统筹数据
RedisTemplate
该工具类根据命令类型的不同封装到了不同的操作中
具体如下

RedisTemplate快速入门
- 引入依赖 一个是redis 的依赖 一个是连接池的依赖
<!-- redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- commons-pool-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.12.1</version>
</dependency>
- 配置连接
需要在properties中配置连接池的各种参数
spring.application.name=demo
spring.data.redis.host=192.168.88.130
spring.data.redis.port=6379
spring.data.redis.password=123456
spring.data.redis.lettuce.pool.max-active=8
spring.data.redis.lettuce.pool.max-idle=8
spring.data.redis.lettuce.pool.min-idle=0
spring.data.redis.lettuce.pool.max-wait=1000ms
- 后续就可以直接注入
RedisTemplate然后使用
RedisTemplate的序列化反序列化
由于RedisTemplate接受的是object数组类型的 所以虽然存储的String字符串 但是会被redis当成java对象 然后处理java对象就是用序列化工具进行序列化 默认采用jdk序列化
进行序列化之后就会变成如下

缺点
- 可读性差
- 内存占用较大
解决该问题就可以RedisTemplate的Key和Value的序列化器
Key使用String序列化器
Value就可以使用json序列化器 因为value有可能是对象
实现就是建一个config对象 然后将RedisTemplate作为Bean注入到容器中
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//创建对象
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
//设置连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
//创建json序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//设置key的序列化
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
//设置value的序列化
redisTemplate.setValueSerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
//返回
return redisTemplate;
}
}
后续再使用就可以在图形化界面中正常显示 因为使用了序列化
StringRedisTemplate
使用json序列化器来处理value 会使对象在存储的时候带上自己所属的类的全类名 转为字节码进行存储 当数据量过大 就会耗过多内存
因此为了节省内存空间 不会使用json序列化器来处理value 然后都用String存储 存的时候以json字符串来存 取的时候拿到的也是json字符串 再另外进行json字符串转为java对象的工作即可
spring默认提供了一个模板类叫做StringTemplate 这个模板类默认使用的序列化器就是String类型的
- 存数据
先new对象 然后存数据的时候将对象转化为json字符串进行存储
private static final ObjectMapper mapper = new ObjectMapper();
User user = new User("呵呵",16);
String json = mapper.writeValueAsString(user);
stringRedisTemplate.opsForValue().set("user:100",json);
- 读数据
存入到redis根据key读出的时候也是json字符串 所以需要手动的将该json字符串反序列化为对象
String jsonUser = stringRedisTemplate.opsForValue().get("user:100");
User user1 = mapper.readValue(jsonUser, User.class);
System.out.println("user1 = " + user1);
然后就实现了节省内存的操作

浙公网安备 33010602011771号