引入依赖包
<dependency> <groupId> redis.clients </groupId> <artifactId> jedis </artifactId> <version> 2.9.0 </version> </dependency> <dependency> <groupId> org.springframework.data </groupId> <artifactId> spring-data-redis </artifactId> <version> 2.3.2.RELEASE </version> </dependency> <dependency> <groupId> io.lettuce </groupId> <artifactId> lettuce-core </artifactId> <version> 6.0.0.RC1 </version> </dependency>
注意: lettuce-core 和 spring-data-redis 的版本有要求,版本低了可能不支持的, spring-data-redis 需要 2 .x 以上的, lettuce-core 测过 5.0.4.RELEASE 是不支持的
测试代码一
public class RedisMain { private void connectRedis (){ RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration() ; redisStandaloneConfiguration.setHostName( "127.0.0.1" ) ; redisStandaloneConfiguration.setDatabase( 8 ) ; redisStandaloneConfiguration.setPort( 6379 ) ; redisStandaloneConfiguration.setPassword( "Fullsee@123" ) ; LettuceClientConfiguration.LettuceClientConfigurationBuilder lettuceClientConfigurationBuilder = LettuceClientConfiguration.builder () ; LettuceConnectionFactory factory = new LettuceConnectionFactory(redisStandaloneConfiguration , lettuceClientConfigurationBuilder.build()) ; factory.afterPropertiesSet() ; RedisTemplate<String , String> redisTemplate = new RedisTemplate<>() ; redisTemplate.setConnectionFactory(factory) ; redisTemplate.afterPropertiesSet() ; redisTemplate.setHashKeySerializer( new StringRedisSerializer()) ; redisTemplate.setHashValueSerializer( new StringRedisSerializer()) ; redisTemplate.setKeySerializer( new StringRedisSerializer()) ; redisTemplate.setValueSerializer( new StringRedisSerializer()) ; System. out .println(redisTemplate.getClientList()) ; Object o = redisTemplate.opsForHash().get( "ALARM_LEVEL_MAPPING:around" , "0001" ) ; System. out .println(o) ; } public static void main (String[] args) { RedisMain redisMain = new RedisMain() ; redisMain.connectRedis() ; } }
代码解读
测试代码二
package com.fullsee.redis ; import org.apache.commons.pool2.impl.GenericObjectPoolConfig ; import org.springframework.data.redis.connection.RedisConfiguration ; import org.springframework.data.redis.connection.RedisStandaloneConfiguration ; import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration ; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory ; import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration ; import org.springframework.data.redis.core.RedisTemplate ; import org.springframework.data.redis.serializer.StringRedisSerializer ; import java.time.Duration ; /** * <li> 文件名称 : 题目名称 </li> * <li> 文件描述 : 题目名称 功能描述 </li> * <li> 版权所有 : 版权所有 © 2005-2019 </li> * <li> 公 司 : Fullsee </li> * <li> 内容摘要 : 无 </li> * <li> 其他说明 : 无 </li> * <li> 完成日期: 2020-08-05 18:15 </li> * <li> 修改记录 : 无 </li> * * @author songyunbing * @version 产品版本 */ public class RedisMain2 { /** * 自定义 LettuceConnectionFactory, 这一步的作用就是返回根据你传入参数而配置的 * LettuceConnectionFactory , * 也可以说是 LettuceConnectionFactory 的原理了, * 后面我会详细讲解的 , 各位同学也可先自己看看源码 这里定义的方法 createLettuceConnectionFactory ,方便快速使用 */ private LettuceConnectionFactory createLettuceConnectionFactory ( int dbIndex , String hostName , int port , String password , int maxIdle ,int minIdle ,int maxActive , Long maxWait , Long timeOut , Long shutdownTimeOut){ //redis 配置 RedisConfiguration redisConfiguration = new RedisStandaloneConfiguration(hostName , port) ; ((RedisStandaloneConfiguration) redisConfiguration).setDatabase(dbIndex) ; ((RedisStandaloneConfiguration) redisConfiguration).setPassword(password) ; // 连接池配置 GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig() ; genericObjectPoolConfig.setMaxIdle(maxIdle) ; genericObjectPoolConfig.setMinIdle(minIdle) ; genericObjectPoolConfig.setMaxTotal(maxActive) ; genericObjectPoolConfig.setMaxWaitMillis(maxWait) ; //redis 客户端配置 LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration.builder (). commandTimeout(Duration.ofMillis (timeOut)) ; builder.shutdownTimeout(Duration.ofMillis (shutdownTimeOut)) ; builder.poolConfig(genericObjectPoolConfig) ; LettuceClientConfiguration lettuceClientConfiguration = builder.build() ; // 根据配置和客户端配置创建连接 LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisConfiguration , lettuceClientConfiguration) ; lettuceConnectionFactory .afterPropertiesSet() ; return lettuceConnectionFactory ; } public static void main (String[] args) { RedisMain2 redisMain2 = new RedisMain2() ; LettuceConnectionFactory factory = redisMain2.createLettuceConnectionFactory( 8 , "127.0.0.1" , 6379 , "Fullsee@123" , 1024 , 200 , 200 , 10000l , 10000l , 10000l ) ; RedisTemplate<String , String> redisTemplate = new RedisTemplate<>() ; redisTemplate.setConnectionFactory(factory) ; redisTemplate.afterPropertiesSet() ; redisTemplate.setHashKeySerializer( new StringRedisSerializer()) ; redisTemplate.setHashValueSerializer( new StringRedisSerializer()) ; redisTemplate.setKeySerializer( new StringRedisSerializer()) ; redisTemplate.setValueSerializer( new StringRedisSerializer()) ; System. out .println(redisTemplate.getClientList()) ; Object o = redisTemplate.opsForHash().get( "ALARM_LEVEL_MAPPING:around" , "0001" ) ; System. out .println(o) ; } }
Jedis和redisTemplate对应关系
String类型结构
Redis
RedisTemplate rt
set key value
rt.opsForValue().set("key","value")
get key
rt.opsForValue().get("key")
del key
rt.delete("key")
strlen key
rt.opsForValue().size("key")
getset key value
rt.opsForValue().getAndSet("key","value")
getrange key start end
rt.opsForValue().get("key",start,end)
append key value
rt.opsForValue().append("key","value")
Hash 结构
hmset key field1 value1 field2 value2...
rt.opsForHash().putAll("key",map) //map 是一个集合对象
hset key field value
rt.opsForHash().put("key","field","value")
hexists key field
rt.opsForHash().hasKey("key","field")
hgetall key
rt.opsForHash().entries("key") // 返回Map对象
hvals key
rt.opsForHash().values("key") // 返回List对象
hkeys key
rt.opsForHash().keys("key") // 返回List对象
hmget key field1 field2...
rt.opsForHash().multiGet("key",keyList)
hsetnx key field value
rt.opsForHash().putIfAbsent("key","field","value"
hdel key field1 field2
rt.opsForHash().delete("key","field1","field2")
hget key field
rt.opsForHash().get("key","field")
List 结构
lpush list node1 node2 node3...
rt.opsForList().leftPush("list","node")
rt.opsForList().leftPushAll("list",list) //list 是集合对象
rpush list node1 node2 node3...
rt.opsForList().rightPush("list","node")
rt.opsForList().rightPushAll("list",list) //list 是集合对象
lindex key index
rt.opsForList().index("list", index)
llen key
rt.opsForList().size("key")
lpop key
rt.opsForList().leftPop("key")
rpop key
rt.opsForList().rightPop("key")
lpushx list node
rt.opsForList().leftPushIfPresent("list","node")
rpushx list node
rt.opsForList().rightPushIfPresent("list","node")
lrange list start end
rt.opsForList().range("list",start,end)
lrem list count value
rt.opsForList().remove("list",count,"value")
lset key index value
rt.opsForList().set("list",index,"value")
ltrim key start stop
/
Set 结构
sadd key member1 member2...
rt.boundSetOps("key").add("member1","member2",...)
rt.opsForSet().add("key", set) //set 是一个集合对象
scard key
rt.opsForSet().size("key")
sidff key1 key2
rt.opsForSet().difference("key1","key2") // 返回一个集合对象
sinter key1 key2
rt.opsForSet().intersect("key1","key2")// 同上
sunion key1 key2
rt.opsForSet().union("key1","key2")// 同上
sdiffstore des key1 key2
rt.opsForSet().differenceAndStore("key1","key2","des")
sinter des key1 key2
rt.opsForSet().intersectAndStore("key1","key2","des")
sunionstore des key1 key2
rt.opsForSet().unionAndStore("key1","key2","des")
sismember key member
rt.opsForSet().isMember("key","member")
smembers key
rt.opsForSet().members("key")
spop key
rt.opsForSet().pop("key")
srandmember key count
rt.opsForSet().randomMember("key",count)
srem key member1 member2...
rt.opsForSet().remove("key","member1","member2",...)
有些命令Spring所提供的RedisTemplate并不能支持,比如linsert命令,这个时候可以使用更为底层的方法,如代码:
try { rt.getConnectionFactory().getConnection().lInsert( "list" .getBytes( "utf-8" ), RedisListCommands.Position.BEFORE, "node2" .getBytes( "utf-8" ), "before_node2" .getBytes( "utf-8" )); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); }
参考
https://segmentfault.com/q/1010000020636384
https://blog.csdn.net/qq_42394457/article/details/94493027
https://blog.csdn.net/groggy_puppy/article/details/83379948