上周中秋开始之前,公司安排了一场关于redis的培训,经过几天的努力,小有收获,今天整理出搭建spring+redis的简单的文档,日后随着不断的使用也会把一些需要注意的地方总结出来。最下面有网友可能需要的资料,可以到...
上周中秋开始之前,公司安排了一场关于redis的培训,经过几天的努力,小有收获,今天整理出搭建spring+redis的简单的文档,日后随着不断的使用也会把一些需要注意的地方总结出来。最下面有网友可能需要的资料,可以到网盘里下载哦。
Redis使用说明文档
1.添加需要依赖的包
jedis-2.9.0.jar
spring-data-redis-2.0.10.RELEASE.jar
2.spring的相关配置
(1)Spring-redis连接池管理工厂
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionF actory">
<!-- IP地址 -->
<property name="hostName" value="${redis.host}" />
<!-- 端口号 -->
<property name="port" value="${redis.port}" />
<!-- 超时时间 默认2000-->
<property name="timeout" value="${redis.timeout}" />
<!-- 连接池配置引用 -->
<property name="poolConfig" ref="poolConfig" />
<!-- usePool:是否使用连接池 -->
<property name="usePool" value="true"/>
</bean>
对应的相关配置 redis.properties
redis.host=127.0.0.1 //IP
redis.port=6379 //端口号
redis.password="" //密码
redis.maxIdle=400 //最大空闲数
redis.maxTotal=6000 //最大空连接数
redis.maxWaitMillis=1000 //最大等待时间
redis.blockWhenExhausted=true //连接超时时是否阻塞,false时报异 常,ture阻塞直到超时, 默认true
redis.testOnBorrow=true //返回连接时,检测连接是否成功
redis.timeout=100000 //超时
defaultCacheExpireTime=60 //默认缓存有效期时间
(2)注入RedisTemplate,该bean提供了在java中使用相关指令进行redis相关的使用操作
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory" />
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
</property>
<property name="hashKeySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="hashValueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
</property>
<!--开启事务 -->
<property name="enableTransactionSupport" value="true"></property>
</bean>
(3)自定义redis工具类,在需要缓存的地方注入此类(此类只是简化了redis在java代码中的操作,如果有更好的方式可以自己重新定义,也可以不定义,直接使用redisTemplate,当然为了方便使用尽量自定义一个工具类,使其操作时与redis的指令相同,更加规范)
<bean id="redisrCacheManager" class="com.redis.manager.RedisCacheManager">
<property name="redisTemplate" ref="redisTemplate" />
</bean>
3.调用
指定缓存失效时间
redisTemplate.expire(key, time, TimeUnit.SECONDS);
返回 boolean
根据key 获取过期时间
redisTemplate.getExpire(key, TimeUnit.SECONDS);
时间(秒) 返回0代表为永久有效
判断key是否存在
redisTemplate.hasKey(key);
true 存在 false不存在
删除缓存(可以传一个值 或多个)
redisTemplate.delete(key[0]);
无返回
============================String=========================
普通缓存获取
redisTemplate.opsForValue().get(key);
返回Object
普通缓存放入
redisTemplate.opsForValue().set(key, value);
无返回
普通缓存放入并设置时间
redisTemplate.opsForValue().set(key, value, time,
TimeUnit.SECONDS);
无返回
递增
String key, long delta(要增加几(大于0))
redisTemplate.opsForValue().increment(key, delta);
返回long
递减
redisTemplate.opsForValue().increment(key, -delta);
返回long
================================Map========================
获取
redisTemplate.opsForHash().get(key, item);
返回Object
获取hashKey对应的所有键值
redisTemplate.opsForHash().entries(key);
对应的多个键值Map<Object, Object>
存入map
redisTemplate.opsForHash().putAll(key, map);
无返回
HashSet 并设置时间
redisTemplate.opsForHash().putAll(key, map);
无返回
向一张hash表中放入数据,如果不存在将创建
redisTemplate.opsForHash().put(key, item, value);
无返回
删除hash表中的值
redisTemplate.opsForHash().delete(key, item);
无返回
判断hash表中是否有该项的值
redisTemplate.opsForHash().hasKey(key, item);
返回boolean
hash递增 如果不存在,就会创建一个 并把新增后的值返回
By:要增加几(大于0)
redisTemplate.opsForHash().increment(key, item, by);
返回double
hash递减
By 要减少记(小于0)
redisTemplate.opsForHash().increment(key, item, -by);
返回double
========================Set======================
根据key获取Set中的所有值
redisTemplate.opsForSet().members(key);
返回 Set<Object>
根据value从一个set中查询,是否存在
redisTemplate.opsForSet().isMember(key, value);
true存在 false不存在
将数据放入set缓存
Values 多个值
redisTemplate.opsForSet().add(key, values);
成功个数
获取set缓存的长度
redisTemplate.opsForSet().size(key);
Long
移除值为value的
redisTemplate.opsForSet().remove(key, values);
移除的个数
========================sorted Set======================
根据key获取Set中的所有值
开始位置
结束位置
redisTemplate.opsForZSet().range(key, start, end);
Set<Object>
根据key和value获取指定value所在的位置(递增顺序排列)
redisTemplate.opsForZSet().rank(key, value);
Long
将数据放入set缓存
Values Set<TypedTuple<Object>>值 可以是多个
redisTemplate.opsForZSet().add(key, values);
成功个数
根据key和value获取指定value所在的位置(递减顺序排列)
redisTemplate.opsForZSet().reverseRank(key, value);
Long
移除值为value的
Values Object... values值 可以是多个
redisTemplate.opsForZSet().remove(key, values);
移除的个数
=============================list========================
获取list缓存的内容
long start, long end
redisTemplate.opsForList().range(key, start, end);
List<Object>
获取list缓存的长度
redisTemplate.opsForList().size(key);
Long
通过索引 获取list中的值
Index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
redisTemplate.opsForList().index(key, index);
Object
将list放入缓存
Value Object、List<Object>
redisTemplate.opsForList().rightPush(key, value);
无返回
根据索引修改list中的某条数据
redisTemplate.opsForList().set(key, index, value);
无返回
移除N个值为value
Count 移除多少个
redisTemplate.opsForList().remove(key, count, value);
移除的个数
将上述调用整合为自定义的工具类的话如下:
package com.redis.manager;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations.TypedTuple;
import org.springframework.util.CollectionUtils;
/**
* Redis Util
*
* @author sun
* @date 2018年9月21日
*
*/
public class RedisCacheManager {
private RedisTemplate<String, Object> redisTemplate;
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
/**
* 指定缓存失效时间
*
* @param key
* 键
* @param time
* 时间(秒)
* @return
*/
public boolean expire(String key, long time) {
try {
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据key 获取过期时间
*
* @param key
* 键 不能为null
* @return 时间(秒) 返回0代表为永久有效
*/
public long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
/**
* 判断key是否存在
*
* @param key
* 键
* @return true 存在 false不存在
*/
public boolean hasKey(String key) {
try {
return redisTemplate.hasKey(key);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 删除缓存
*
* @param key
* 可以传一个值 或多个
*/
@SuppressWarnings("unchecked")
public void del(String... key) {
if (key != null && key.length > 0) {
if (key.length == 1) {
redisTemplate.delete(key[0]);
} else {
redisTemplate.delete(CollectionUtils.arrayToList(key));
}
}
}
// ============================String=============================
/**
* 普通缓存获取
*
* @param key
* 键
* @return 值
*/
public Object get(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}
/**
* 普通缓存放入
*
* @param key
* 键
* @param value
* 值
* @return true成功 false失败
*/
public boolean set(String key, Object value) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 普通缓存放入并设置时间
*
* @param key
* 键
* @param value
* 值
* @param time
* 时间(秒) time要大于0 如果time小于等于0 将设置无限期
* @return true成功 false 失败
*/
public boolean set(String key, Object value, long time) {
try {
if (time > 0) {
redisTemplate.opsForValue().set(key, value, time,
TimeUnit.SECONDS);
} else {
set(key, value);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 递增
*
* @param key
* 键
* @param by
* 要增加几(大于0)
* @return
*/
public long incr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递增因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, delta);
}
/**
* 递减
*
* @param key
* 键
* @param by
* 要减少几(小于0)
* @return
*/
public long decr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递减因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, -delta);
}
// ================================Map=================================
/**
* HashGet
*
* @param key
* 键 不能为null
* @param item
* 项 不能为null
* @return 值
*/
public Object hget(String key, String item) {
return redisTemplate.opsForHash().get(key, item);
}
/**
* 获取hashKey对应的所有键值
*
* @param key
* 键
* @return 对应的多个键值
*/
public Map<Object, Object> hmget(String key) {
return redisTemplate.opsForHash().entries(key);
}
/**
* HashSet
*
* @param key
* 键
* @param map
* 对应多个键值
* @return true 成功 false 失败
*/
public boolean hmset(String key, Map<String, Object> map) {
try {
redisTemplate.opsForHash().putAll(key, map);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* HashSet 并设置时间
*
* @param key
* 键
* @param map
* 对应多个键值
* @param time
* 时间(秒)
* @return true成功 false失败
*/
public boolean hmset(String key, Map<String, Object> map, long time) {
try {
redisTemplate.opsForHash().putAll(key, map);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 向一张hash表中放入数据,如果不存在将创建
*
* @param key
* 键
* @param item
* 项
* @param value
* 值
* @return true 成功 false失败
*/
public boolean hset(String key, String item, Object value) {
try {
redisTemplate.opsForHash().put(key, item, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 向一张hash表中放入数据,如果不存在将创建
*
* @param key
* 键
* @param item
* 项
* @param value
* 值
* @param time
* 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
* @return true 成功 false失败
*/
public boolean hset(String key, String item, Object value, long time) {
try {
redisTemplate.opsForHash().put(key, item, value);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 删除hash表中的值
*
* @param key
* 键 不能为null
* @param item
* 项 可以使多个 不能为null
*/
public void hdel(String key, Object... item) {
redisTemplate.opsForHash().delete(key, item);
}
/**
* 判断hash表中是否有该项的值
*
* @param key
* 键 不能为null
* @param item
* 项 不能为null
* @return true 存在 false不存在
*/
public boolean hHasKey(String key, String item) {
return redisTemplate.opsForHash().hasKey(key, item);
}
/**
* hash递增 如果不存在,就会创建一个 并把新增后的值返回
*
* @param key
* 键
* @param item
* 项
* @param by
* 要增加几(大于0)
* @return
*/
public double hincr(String key, String item, double by) {
return redisTemplate.opsForHash().increment(key, item, by);
}
/**
* hash递减
*
* @param key
* 键
* @param item
* 项
* @param by
* 要减少记(小于0)
* @return
*/
public double hdecr(String key, String item, double by) {
return redisTemplate.opsForHash().increment(key, item, -by);
}
// ============================set=============================
/**
* 根据key获取Set中的所有值
*
* @param key
* 键
* @return
*/
public Set<Object> sGet(String key) {
try {
return redisTemplate.opsForSet().members(key);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 根据value从一个set中查询,是否存在
*
* @param key
* 键
* @param value
* 值
* @return true 存在 false不存在
*/
public boolean sHasKey(String key, Object value) {
try {
return redisTemplate.opsForSet().isMember(key, value);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将数据放入set缓存
*
* @param key
* 键
* @param values
* 值 可以是多个
* @return 成功个数
*/
public long sSet(String key, Object... values) {
try {
return redisTemplate.opsForSet().add(key, values);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 将set数据放入缓存
*
* @param key
* 键
* @param time
* 时间(秒)
* @param values
* 值 可以是多个
* @return 成功个数
*/
public long sSetAndTime(String key, long time, Object... values) {
try {
Long count = redisTemplate.opsForSet().add(key, values);
if (time > 0)
expire(key, time);
return count;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 获取set缓存的长度
*
* @param key
* 键
* @return
*/
public long sGetSetSize(String key) {
try {
return redisTemplate.opsForSet().size(key);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 移除值为value的
*
* @param key
* 键
* @param values
* 值 可以是多个
* @return 移除的个数
*/
public long setRemove(String key, Object... values) {
try {
Long count = redisTemplate.opsForSet().remove(key, values);
return count;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
// ============================sorted Set=============================
/**
* 根据key获取Set中的所有值
*
* @param key
* 键
* @param start
* 开始位置
* @param end
* 结束位置
* 0 -1代表全部
* @return
*/
public Set<Object> ssGet(String key, long start, long end) {
try {
return redisTemplate.opsForZSet().range(key, start, end);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 根据key和value获取指定value所在的位置(递增顺序排列)
*
* @param key
* 键
* @param value
* 值
* @return true 存在 false不存在
*/
public long ssGetUpIndex(String key, Object value) {
try {
return redisTemplate.opsForZSet().rank(key, value);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 将数据放入set缓存
*
* @param key
* 键
* @param values
* 值 可以是多个
* @return 成功个数
*/
public long ssSet(String key, Set<TypedTuple<Object>> values) {
try {
return redisTemplate.opsForZSet().add(key, values);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 根据key和value获取指定value所在的位置(递减顺序排列)
*
* @param key
* 键
* @return
*/
public long ssGetLowIndex(String key, Object value) {
try {
return redisTemplate.opsForZSet().reverseRank(key, value);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 移除值为value的
*
* @param key
* 键
* @param values
* 值 可以是多个
* @return 移除的个数
*/
public long ssRemove(String key, Object... values) {
try {
Long count = redisTemplate.opsForZSet().remove(key, values);
return count;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
// ===============================list=================================
/**
* 获取list缓存的内容
*
* @param key
* 键
* @param start
* 开始
* @param end
* 结束 0 到 -1代表所有值
* @return
*/
public List<Object> lGet(String key, long start, long end) {
try {
return redisTemplate.opsForList().range(key, start, end);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 获取list缓存的长度
*
* @param key
* 键
* @return
*/
public long lGetListSize(String key) {
try {
return redisTemplate.opsForList().size(key);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 通过索引 获取list中的值
*
* @param key
* 键
* @param index
* 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
* @return
*/
public Object lGetIndex(String key, long index) {
try {
return redisTemplate.opsForList().index(key, index);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 将list放入缓存
*
* @param key
* 键
* @param value
* 值
* @param time
* 时间(秒)
* @return
*/
public boolean lSet(String key, Object value) {
try {
redisTemplate.opsForList().rightPush(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
*
* @param key
* 键
* @param value
* 值
* @param time
* 时间(秒)
* @return
*/
public boolean lSet(String key, Object value, long time) {
try {
redisTemplate.opsForList().rightPush(key, value);
if (time > 0)
expire(key, time);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
*
* @param key
* 键
* @param value
* 值
* @param time
* 时间(秒)
* @return
*/
public boolean lSet(String key, List<Object> value) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
*
* @param key
* 键
* @param value
* 值
* @param time
* 时间(秒)
* @return
*/
public boolean lSet(String key, List<Object> value, long time) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
if (time > 0)
expire(key, time);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据索引修改list中的某条数据
*
* @param key
* 键
* @param index
* 索引
* @param value
* 值
* @return
*/
public boolean lUpdateIndex(String key, long index, Object value) {
try {
redisTemplate.opsForList().set(key, index, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 移除N个值为value
*
* @param key
* 键
* @param count
* 移除多少个
* @param value
* 值
* @return 移除的个数
*/
public long lRemove(String key, long count, Object value) {
try {
Long remove = redisTemplate.opsForList().remove(key, count, value);
return remove;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
}
下面是福利时间,这是我们公司培训的资料,包括windows和linux下的解压包及安装步骤,及相关源码
链接:https://pan.baidu.com/s/13QAgfGFBzXyLY4j-IBUqZQ 密码:x4t0
听培训的同时说,资料是从网上找的,我也不知道从哪找的,所以,如果我冒犯了哪位大神,请通知下我,我标明下出处。谢谢。
本文标题为:spring+redis如何使用
基础教程推荐
- Mysql主从三种复制模式(异步复制,半同步复制,组复 2022-09-01
- python中pandas库的iloc函数用法解析 2023-07-28
- 如何将excel表格数据导入postgresql数据库 2023-07-20
- 关于MySQL中explain工具的使用 2023-07-27
- Redis如何实现延迟队列 2023-07-13
- Mysql查询所有表和字段信息的方法 2023-07-26
- Sql Server Management Studio连接Mysql的实现步骤 2023-07-29
- Python常见库matplotlib学习笔记之多个子图绘图 2023-07-27
- SQLServer 清理日志的实现 2023-07-29
- 【Redis】数据持久化 2023-09-12