一、基本介绍
RedisTemplate 为 spring 对 redis 操作的高度封装,基本已经满足所有使用场景。
若存在其他拓展使用我们可以自行封装工具类对基本操作进行组装。
RedisLockRegistry 对 redis 锁的一些封装
二、不同环境下依赖以及基本配置
2.1 spring-boot 下依赖
(版本按需替换)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>3.1.2</version>
</dependency>
可通过 @Autowired 直接注入
@Autowired
private RedisTemplate redisTemplate
配置该类的序列化和反序列化类(可选,存在默认值)
@Configuration
public class RedisConfig {
// 设置Redis序列化方式 默认使用的JDKSerializer序列化 即转为字节存储 在redis 客户端中没有可读性 一般使用 StringRedisSerializer 或 FastJsonRedisSerializer
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// key序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
// value序列化
redisTemplate.setValueSerializer(new FastJsonRedisSerializer<>(Object.class));
// Hash key序列化
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// Hash value序列化
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}
}
若使用 FastJsonRedisSerializer 做反序列化需要引入 fastJson 依赖
(版本按需替换)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
2.2 一般 spring,spring-mvc 环境
核心依赖为
(版本按需替换)
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.7.0</version>
</dependency>
但如果使用
(版本按需替换)
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-redis</artifactId>
<version>4.3.19.RELEASE</version>
</dependency>
该包内部也包含了 spring-data-redis 依赖
若引用jedispool 则还需引入
(版本按需替换)此包也是redis 最基础的依赖,但由于更名 所以也叫 jedis
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.10.2</version>
</dependency>
此类 redisTemplate 初始化动作 以及基本封装
实际内部数据可以通过读取配置文件或者 静态utils 工具类来设置,来获取
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.integration.redis.util.RedisLockRegistry;
import redis.clients.jedis.JedisPoolConfig;
public class RedisReg {
private static RedisTemplate<String, String> redisTemplate;
private static RedisLockRegistry redisLockRegistry;
// 静态代码块做初始化
static {
JedisPoolConfig poolConfig = new JedisPoolConfig();
JedisConnectionFactory factory = new JedisConnectionFactory();
factory.setHostName(redis地址);
factory.setPort(redis端口);
factory.setPassword(若存在密码则复制);
factory.setPoolConfig(redis 连接池);
// 在 spring bean初始化完成后执行
factory.afterPropertiesSet();
RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
// key 序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
// value 序列化
redisTemplate.setValueSerializer(new StringRedisSerializer());
// 在 spring bean初始化完成后执行
redisTemplate.afterPropertiesSet();
RedisReg.redisTemplate = redisTemplate;
RedisReg.redisLockRegistry =
new RedisLockRegistry(factory, "redis-lock(任意不重复即可)", 超时时间-毫秒);
}
public static RedisTemplate<String, String> getRedisTemplate() {
return redisTemplate;
}
public static RedisLockRegistry getRedisLockRegistry() {
return redisLockRegistry;
}
}
三、redisTemplate 基本使用
当redisTemplate初始化完成并获取到 redisTemplate 后即可执行一些基本操作
根据 redis 的基本类型, redisTemplate提供了对应的各种操作方式
3.1 Spring提供的Redis数据结构的操作类
ops 即 英文 Operations 操作缩写,For 后跟对应的操作对象类型
常用的一般为前四个,即 Stirng,List,Set, Zset, Hash
Hash 常用来存储和对象类型 Map 类型
3.3 string 类基本操作
set一类:
补充说明:
第一个 携带 offset 偏移量的为:用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始
setIfAbsent: 如果不存在则赋值 并返回true ,相对的如果已经存在key 则返回false 也意味着赋值失败 ifPresent 则相反
setBit: 将二进制第offset位值变为value
get一类:
// 在指定key 的value 后追加内容
redisTemplate.opsForValue().append(key, value)
// 获取字符串长度
redisTemplate.opsForValue().size(key)
递增
递减
3.4 list 类基本操作
push 加入操作:
rightPopAndLeftPush: 为从一个key 对应的list 队尾获取一个元素,并将该元素放到 目的队列的最左边
获取操作:
// 获取列表指定范围内的元素(start开始位置, 0是开始位置,end 结束位置, -1返回所有)
redisTemplate.opsForList().range(key, start, end);
指定获取 index 一类:
pop 取出动作:
从左侧或者右侧移除一个元素并取出,若没有元素时阻塞队列等待到超时或者直到出现可以移除并取出的元素
// 在指定索引处插入值
redisTemplate.opsForList().set(key, index, value)
// 指定 key 下存储的list 的值的长度
redisTemplate.opsForList().size(key)
// 删除集合中值等于value的元素(index=0, 删除所有值等于value的元素; index>0, 从头部开始删除第一个值等于value的元素; index<0, 从尾部开始删除第一个值等于value的元素)
redisTemplate.opsForList().remove(key, index, value)
// 将List列表进行剪裁
redisTemplate.opsForList().trim(key, start, end)
3.5 set 类基本操作
差集
交集
并集
结果获取(count 表个数)
// 添加元素
redisTemplate.opsForSet().add(key, values)
// 删除单个或多个值
redisTemplate.opsForSet().remove(key, values....)
// 移除并返回一个随机元素
redisTemplate.opsForSet().pop(key)
// 集合长度
redisTemplate.opsForSet().size(key)
// 是否包含某一个值
redisTemplate.opsForSet().isMember(key, value)
// 遍历set类似于Interator(ScanOptions.NONE为显示所有的)
redisTemplate.opsForSet().scan(key, options)
Cursor<String> dwa = redisTemplate.opsForSet().scan("dwa", ScanOptions.NONE);
while (dwa.hasNext()) {
}
3.6 hash 类基本操作
基本用于存储对象类型,或map
// 获取指定key 下,对象的某一个属性,有则返回无则为null
redisTemplate.opsForHash().get(key, field)
// 获取所有键值对
redisTemplate.opsForHash().entries(key)
// 获取所有hashkey
redisTemplate.opsForHash().keys(key)
// 获取所有hashkey 下的值
redisTemplate.opsForHash().values(key)
// 获取hash 中所有字段数量
redisTemplate.opsForHash().size(key)
// 删除一个或多个hashkey
redisTemplate.opsForHash().delete(key, fields....)
// 是否存在hasKey
redisTemplate.opsForHash().hasKey(key, field)
// 获取可遍历键值对 ScanOptions.NONE为获取全部键对
redisTemplate.opsForHash().scan(key, options)
// 为指定hash key 对应整数字段做自增
redisTemplate.opsForHash().increment(key, field, increment)
补充:hashKey 不存在时增加
3.7 zSet类型
有序集合
// 添加元素(有序集合是按照元素的score值由小到大进行排列)
redisTemplate.opsForZSet().add(key, value, score)
// 删除对应的value,value可以为多个值
redisTemplate.opsForZSet().remove(key, values)
// 增加元素的score值,并返回增加后的值
redisTemplate.opsForZSet().incrementScore(key, value, delta)
// 返回元素在集合的排名,有序集合是按照元素的score值由小到大排列
redisTemplate.opsForZSet().rank(key, value)
// 返回元素在集合的排名,按元素的score值由大到小排列
redisTemplate.opsForZSet().reverseRank(key, value)
// 获取集合中给定区间的元素(start 开始位置,end 结束位置, -1查询所有)
redisTemplate.opsForZSet().reverseRangeWithScores(key, start,end)
// 按照Score值查询集合中的元素,结果从小到大排序
redisTemplate.opsForZSet().reverseRangeByScore(key, min, max)
redisTemplate.opsForZSet().reverseRangeByScoreWithScores(key, min, max)
// 返回值为:Set<ZSetOperations.TypedTuple<V>>
// 从高到低的排序集中获取分数在最小和最大值之间的元素
redisTemplate.opsForZSet().reverseRangeByScore(key, min, max, start, end)
// 根据score值获取集合元素数量
redisTemplate.opsForZSet().count(key, min, max)
// 获取集合的大小
redisTemplate.opsForZSet().size(key)
redisTemplate.opsForZSet().zCard(key)
// 获取集合中key、value元素对应的score值
redisTemplate.opsForZSet().score(key, value)
// 移除指定索引位置处的成员
redisTemplate.opsForZSet().removeRange(key, start, end)
// 移除指定score范围的集合成员
redisTemplate.opsForZSet().removeRangeByScore(key, min, max)
// 获取key和otherKey的并集并存储在destKey中(其中otherKeys可以为单个字符串或者字符串集合)
redisTemplate.opsForZSet().unionAndStore(key, otherKey, destKey)
// 获取key和otherKey的交集并存储在destKey中(其中otherKeys可以为单个字符串或者字符串集合)
redisTemplate.opsForZSet().intersectAndStore(key, otherKey, destKey)
// 遍历集合 类似迭代器 iterator
Cursor<TypedTuple<Object>> scan = opsForZSet.scan("hahaha", ScanOptions.NONE);
while (scan.hasNext()){
ZSetOperations.TypedTuple<Object> item = scan.next();
System.out.println(item.getValue() + ":" + item.getScore());
}
部分参考:
参考连接1
参考连接2
脚本之家等