Redis
是一款开源的 Key-Value 数据库,运行在内存中,由 C 语言编写。企业卡法通常采用 Redis 来实现缓存。同类的产品还有 Memecache、Memcached 等。
Jedis
是 Redis 官方推出的一款面向 Java 的客户端,提供了很多接口供 Java 语言调用。可以在 Redis 官网下载,当然还有一些开源爱好者提供的客户端,如:Jredis、SRP 等等,推荐使用 Jedis。
spring-data-redis
是 Spring 大家族的一部分,提供了在 Spring 应用中通过简单的配置访问 Redis 服务,对 Redis 底层开发包(Jedis、JRedis、RJC)进行了高度封装,RedisTemplate 提供了 Redis 各种数据操作、异常处理及序列化、支持发布订阅,并对 Spring 3.1 Cache 进行了实现。
spring-data-redis 提供功能如下:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(适用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值标识没有限制)
spring.redis-jedis.pool.max-wait=-1ms
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=5000ms
@Autowired
private RedisTemplate redisTemplate;
// 删除单个key
redisTemplate.delete("keyTest");
// 删除多个key
redisTemplate.deleteKey("keyTest1", "keyTest2");
// 指定key的失效时间
redisTemplate.expire("keyTest", 1, TimeUnit.SECONDS);
// 根据key获取过期时间
long expire = redisTemplate.getExpire("keyTest");
// 判断key是否存在
boolean hasKey = redisTemplate.hasKey("keyTest");
@Autowired
private RedisTemplate redisTemplate;
// 添加缓存(通过 BoundValueOperations 设置值)
redisTemplate.boundValueOps("KeyTest").set("ValueTest");
redisTemplate.boundValueOps("KeyTest").set("ValueTest", 1, TimeUnit.SECONDS);
// 添加缓存(通过 ValueOperations 设置值)
redisTemplate.opsForValue().set("KeyTest", "ValueTest");
redisTemplate.opsForValue().set("KeyTest", "ValueTest", 1, TimeUnit.SECONDS);
// 设置过期时间(单独设置)
redisTemplate.boundValueOps("KeyTest").expire(1, TimeUnit.SECONDS);
redisTemplate.expire("KeyTest", 1, TimeUnit.SECONDS);
// 获取缓存(通过 BoundValueOperations/ValueOperations 获取值)
String valueTest = redisTemplate.boundValueOps("KeyTest").get();
String valueTest = redisTemplate.opsForValue().get("KeyTest");
// 删除缓存
Boolean result = redisTemplate.delete("KeyTest");
// 顺序递增
redisTemplate.boundValueOps("KeyTest").increment(1L);
// 顺序递减
redisTemplate.boundValueOps("KeyTest").increment(-1L);
// 添加缓存(通过 BoundHashOperations/HashOperations 设置值)
redisTemplate.boundHashOps("KeyTest").put("name", "ACGkaka");
redisTemplate.opsForHash().put("KeyTest", "name", "ACGkaka");
// 设置过期时间(单独设置)
redisTemplate.boundValueOps("KeyTest").expire(1, TimeUnit.SECONDS);
redisTemplate.expire("KeyTest", 1, TimeUnit.SECONDS);
// 添加一个Map集合
HashMap<String, String> map = new HashMap<>();
redisTemplate.boundHashOps("KeyTest").putAll(map);
// 获取对象的所有属性key
Set keys = redisTemplate.boundHashOps("KeyTest").keys();
Set keys = redisTemplate.opsForHash().keys("KeyTest");
// 获取对象的所有属性value
List values = redisTemplate.boundHashOps("KeyTest").values();
List values = redisTemplate.opsForHash().values("KeyTest");
// 根据对象的属性key,获取属性value
String value = (String) redisTemplate.boundHashOps("KeyTest").get("name");
String value = (String) redisTemplate.opsForHash().get("KeyTest", "name");
// 获取对象的所有属性键值对集合
Map entries = redisTmpelate.boundHashOps("KeyTest").entries();
Map entries = redisTemplate.opsForHash().entries("KeyTest");
// 删除对象
redisTemplate.delete("KeyTest");
// 删除对象属性
redisTemplate.boundHashOps("KeyTest").delete("name");
// 判断对象是否存在
Boolean isEmpty = redisTemplate.boundHashOps("KeyTest").hasKey("name");
// 添加缓存(通过 BoundHashOperations/HashOperations 设置值)
redisTemplate.boundSetOps("KeyTest").add("ValueTest1", "ValueTest2");
redisTemplate.opsForSet().add("KeyTest", "ValueTest1", "ValueTest2");
// 设置过期时间(单独设置)
redisTemplate.boundValueOps("KeyTest").expire(1, TimeUnit.SECONDS);
redisTemplate.expire("KeyTest", 1, TimeUnit.SECONDS);
// 根据key,获取Set中的所有值
Set set = redisTemplate.boundSetOps("KeyTest").members();
Set set = redisTemplate.opsForSet().members("KeyTest");
// 根据value,从Set中查询是否存在
Boolean isEmpty = redisTemplate.boundSetOps("KeyTest").isMember("ValueTest");
// 获取Set缓存长度
Long size = redisTemplate.boundSetOps("KeyTest").size();
// 移除指定的单元
Long result = redisTemplate.boundSetOps("KeyTest").remove("ValueTest");
// 移除指定的key
Boolean result = redisTemplate.delete("KeyTest");
// 添加缓存(通过 BoundHashOperations 设置值)
redisTemplate.boundListOps("KeyTest").leftPush("ValueTest");
redisTemplate.boundListOps("KeyTest").rightPush("ValueTest");
// 添加缓存(通过 HashOperations 设置值)
redisTemplate.opsForList().leftPush("KeyTest", "ValueTest");
redisTemplate.opsForList().rightPush("KeyTest", "ValueTest");
// 设置过期时间
redisTemplate.boundValueOps("KeyTest").expire(1, TimeUnit.SECONDS);
redisTemplate.expire("KeyTest", 1, TimeUnit.SECONDS);
// 添加一个List集合
List<String> list = new ArrayList<>();
redisTemplate.boundListOps("KeyTest").leftPushAll(list);
redisTemplate.boundListOps("KeyTest").rightPushAll(list);
// 根据索引,获取一段缓存
List list = redisTemplate.boundListOps("KeyTest").range(0, 10);
// 从左弹出一个元素
String key = (String) redisTemplate.boundListOps("KeyTest").leftPop();
// 从右弹出一个元素
String key = (String) redisTemplate.boundListOps("KeyTest").rightPop();
// 根据索引,查询元素
String key = (String) redisTemplate.boundListOps("KeyTest").index(1);
// 获取List缓存的长度
Long size = redisTemplate.boundListOps("KeyTest").size();
// 根据索引,修改List中的某条数据
redisTemplate.boundListOps("KeyTest").set(3L, "ValueTest");
// 移除N个value值
redisTemplate.boundListOps("KeyTest").remove(3L, "ValueTest");
zset中value不允许重复,默认升序排序。
// 添加缓存(通过 BoundHashOperations 设置值)
redisTemplate.boundZSetOps("KeyTest").add("ValueTest", 10D);
// 添加缓存(通过 HashOperations 设置值)
redisTemplate.opsForZSet().add("KeyTest", "ValueTest", 10D);
// 添加多个缓存
DefaultTypedTuple<String> p1 = new DefaultTypedTuple<>("ValueTest", 1.1D);
DefaultTypedTuple<String> p2 = new DefaultTypedTuple<>("ValueTest", 1.2D);
redisTemplate.boundZSetOps("KeyTest").add(new HashSet<>(Arrays.asList(p1, p2)));
// 按照排名先后(从小到大)打印指定区间内的元素,-1为打印全部
Set<String> range = redisTemplate.boundZSetOps("KeyTest").range(0, -1);
// 获取指定元素的分数
Double score = redisTemplate.boundZSetOps("KeyTest").score("VelueTest");
// 获取元素个数
Long size = redisTemplate.boundZSetOps("KeyTest").size();
// 获取分数范围内的元素个数
Long count = redisTemplate.boundZSetOps("KeyTest").count(0D, 2.2D);
// 获取分数范围内的元素
Set set = redisTemplate.boundZSetOps("KeyTest").rangeByScore(0D, 2.2D);
// 获取分数范围内的元素,带偏移量和个数(key, 起始分数, 最大分数, 偏移量, 个数)
Set set = redisTemplate.opsForZSetOps().rangeByScore("KeyTest", 0D, 2.2D, 1, 3);
// 获取分数范围内元素的排名及分数
Set<TypedTuple<String>> tuples = redisTemplate.boundZSetOps("KeyTest").rangeWithScores(0L, 3L);
for (TypedTuple<String> tuple : tuples) {
System.out.println(tuple.getValue() + ":" + tuple.getScore());
}
// 获取排名(从小到大)
Long rank = redisTemplate.boundZSetOps("KeyTest").rank("ValueSet");
// 获取排名(从大到小)
Long reverseRank = redisTemplate.boundZSetOps("KeyTest").reverseRank("ValueSet");
// 根据value删除元素
redisTemplate.boundZSetOps("KeyTest").remove("ValueSet");
// 根据索引范围删除元素
redisTemplate.boundZSetOps("KeyTest").removeRange(0L, 3L);
// 根据分数范围删除元素
redisTemplate.boundZSetOps("KeyTest").removeRangeByScore(0D, 2.2D);
// 根据value为元素加分
Double score = redisTemplate.boundZSetOps("KeyTest").incrementScore("ValueTest", 1.1D);
整理完毕,完结撒花~
参考地址:
1.RedisTemplate操作Redis,这一篇文章就够了(一),https://blog.csdn.net/lydms/article/details/105224210
2.Springboot使用RedisTemplate优雅地操作redis,https://zhuanlan.zhihu.com/p/69103214