Spring使用Redis
欢迎光临我的博客[http://poetize.cn],前端使用Vue2,聊天室使用Vue3,后台使用Spring Boot
1.引入依赖
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.1.0</version>
</dependency>
2.配置(applicationContext.xml)
1.使用Spring配置JedisPoolConfig对象(连接池)
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!--最大空闲数-->
<property name="maxIdle" value="50"/>
<!--最大连接数-->
<property name="maxTotal" value="100"/>
<!--最大等待时间-->
<property name="maxWaitMillis" value="20000"/>
</bean>
2.为连接池配置工厂模型
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<!--Redis服务地址-->
<property name="hostName" value="localhost"/>
<!--端口号-->
<property name="port" value="6379"/>
<!--如果有密码则需要配置密码-->
<!--<property name="password" value="password"/>-->
<!--连接池配置-->
<property name="poolConfig" ref="poolConfig"/>
</bean>
3.配置RedisTemplate
<bean id="redisTemplate"
class="org.springframework.data.redis.core.RedisTemplate"
p:connection-factory-ref="connectionFactory"/>
</bean>
注:普通的连接根本没有办法直接将对象直接存入 Redis 内存中,我们需要替代的方案:将对象序列化(可以简单的理解为继承Serializable接口)。我们可以把对象序列化之后存入Redis缓存中,然后在取出的时候又通过转换器,将序列化之后的对象反序列化回对象,所有需要POJO对象实现Serializable接口
3.RedisTemplate基本使用
StringRedisTemplate与RedisTemplate
两者的关系是StringRedisTemplate继承RedisTemplate。
两者的数据是不共通的:
StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。
StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
1.redisTemplate.opsForValue().set("student_1", student);
2.10秒后失效
void set(K key, V value, long timeout, TimeUnit unit);
redisTemplate.opsForValue().set("name","tom",10, TimeUnit.SECONDS);
3.用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始
void set(K key, V value, long offset);
使用:template.opsForValue().set("key","hello world");
template.opsForValue().set("key","redis", 6);
System.out.println(template.opsForValue().get("key"));
结果:hello redis
4.不存在才设置,设置成功返回true,失败返回false
Boolean setIfAbsent(K key, V value);
5.为多个键分别设置它们的值
void multiSet(Map<? extends K, ? extends V> m);
为多个键分别取出它们的值
List<V> multiGet(Collection<K> keys);
Map<String,String> maps = new HashMap<String, String>();
maps.put("multi1","multi1");
maps.put("multi2","multi2");
maps.put("multi3","multi3");
template.opsForValue().multiSet(maps);
List<String> keys = new ArrayList<String>();
keys.add("multi1");
keys.add("multi2");
keys.add("multi3");
template.opsForValue().multiGet(keys);
6.为多个键分别设置它们的值,如果存在则返回false,不存在返回true
Boolean multiSetIfAbsent(Map<? extends K, ? extends V> m);
7.设置键的字符串值并返回其旧值
T getAndSet(K key, T value);
8.如果key已经存在并且是一个字符串,则该命令将该值追加到字符串的末尾。
如果键不存在,则它被创建并设置为空字符串并追加,因此APPEND在这种特殊情况下将类似于SET。
Integer append(K key, String value);
9.截取key所对应的value字符串
String get(K key, long start, long end);
使用:
appendTest对应的value为Helloworld
System.out.println("*********"+template.opsForValue().get("appendTest",0,5));
结果:*********Hellow
使用:System.out.println("*********"+template.opsForValue().get("appendTest",0,-1));
结果:*********Helloworld
使用:System.out.println("*********"+template.opsForValue().get("appendTest",-3,-1));
结果:*********rld
10.返回key所对应的value值得长度
Long size(K key);
11.删除key对应的键值对
redisTemplate.opsForValue().getOperations().delete("key");
注:详情参见https://blog.csdn.net/ruby_one/article/details/79141940