之前介绍了redis是什么,现在来介绍一下redis的使用
redis的使用,大部分情况下就这三种,尤其是第三种比较多
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
Jedis jedis = new Jedis("127.0.0.1", 6379);
jedis.set("mykey1", "this is my key1"); // string
jedis.get("mykey1"); // 获取指定key
jedis.del("mykey1") // 删除指定key
jedis.hset("mykeyhash", "username", "root"); // hash
jedis.lpush("mykeyList", "a","b","c","d","e"); // list
jedis.sadd("mykeySet", "a","a","w"); // set
jedis.zadd("mykeyZSet", 60, "root"); // zset
jedis.close();
为了提高redis的连接效率,我们可以用连接池
JedisPoolConfig config = new JedisPoolConfig();
// 连接池的最大连接数
config.setMaxTotal(20);
// 最大空闲的连接数
config.setMaxIdle(5);
// 最小的空闲连接数
config.setMinIdle(3);
// 假设连接池没有连接,客户端需要等待的时间,单位是毫秒
config.setMaxWaitMillis(5000);
JedisPool pool = new JedisPool(config, "127.0.0.1", 6379);
Jedis jedis = pool.getResource();
然后正常使用就行,记得,使用完 close掉,会把连接归还给连接池
spring-data-redis也有连接池,并且会进行自动管理,提供了一个封装程度很高的RedisTemplate类,还把redis客户端的大量API封装成了接口,支持redis那五种数据类型的操作
在Redistemplate中,有两类方法经常使用,opsForXXX、boundXXXOps,这个XXX指的是我们value的类型,前者没有指定指定操作的key,可以在一个连接内,或者说一个事务内,操作多个key以及多个value,后者是制定了一个key,在一个连接内,或者说一个事务内,只能操作这个key以及这个key对应的value
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.3.4.RELEASE</version>
</dependency>
<!--JedisPoolConfig 连接池参数配置-->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!--最大空闲实例数-->
<property name="maxIdle" value="300" />
<!--最大活跃实例数-->
<property name="maxTotal" value="600" />
<!--创建实例时最长等待时间-->
<property name="maxWaitMillis" value="1000" />
<!--创建实例时是否验证-->
<property name="testOnBorrow" value="true" />
</bean>
<!--JedisConnectionFactory 跟配置数据库连接池类似,需要配置JedisConnectionFactory来通过服务器或者连接池的方式获取redis服务器的连接-->
<bean id="connectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="127.0.0.1"/>
<property name="port" value="6379"/>
<property name="usePool" value="true"/>
<property name="poolConfig" ref="poolConfig"/>
</bean>
<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
<bean id="valueSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
<!-- redis模板配置 spring-data-redis提供了一个基础的泛型RedisTemplate封装了基础的crud操作-->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="defaultSerializer" ref="stringRedisSerializer"/>
<property name="keySerializer" ref="stringRedisSerializer"/>
<property name="valueSerializer" ref="valueSerializer"/>
</bean>
@Autowired
private RedisTemplate<String,String> redisTemplate;
redisTemplate.opsForValue().set("key", "value");
String value = redisTemplate.opsForValue().get("key");
注意,这儿类型声明的分别是key和value的属性,value如果是对象,这个对象必须进行序列化,因为在redis中存储对象,redis存储的还是字符串,它会把数据转换为数组的形式存储,所以在存取的时候,涉及到序列化与反序列化
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.3.4.RELEASE</version>
</dependency>
#配置springboot和redis整合,可以直接在程序中注入RedisTemplate对象操作redis数据库spring:
spring:
redis:
host: 127.0.0.1
port: 6379
database: 0
使用方式与上面一致,直接注入使用即可
@Autowired
private StringRedisTemplate stringRedisTemplate;