1. 程式人生 > 實用技巧 >SpringBoot整合Lettuce實現對5種資料型別的操作

SpringBoot整合Lettuce實現對5種資料型別的操作

1.在SpringBoot2.x版本之後,以下依賴預設使用Lettuce實現對redis的操縱。

<!--        spring-data-redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

  

2.新增物件池依賴

<!--        commons-pool2 物件池依賴-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

  

3.配置redis和哨兵。前提在伺服器端配置好主從複用和哨兵模式,並放行相應的埠。

spring.redis.host=伺服器ip
spring.redis.port=redis主伺服器埠
spring.redis.password=redis主伺服器登入密碼
#預設redis資料庫
spring.redis.database=0
spring.redis.timeout=10000ms
spring.redis.lettuce.pool.max-active=1024
spring.redis.lettuce.pool.max-wait=10000ms
spring.redis.lettuce.pool.max-idle=200
spring.redis.lettuce.pool.min-idle=5
#哨兵模式
spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes=ip:port,ip:port,....

  

4.防止儲存到redis中的鍵值對是二進位制字串形式,需進行序列化操作

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        
//為string型別的key設定序列化 redisTemplate.setKeySerializer(new StringRedisSerializer()); //為string型別的value設定序列化 redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); //為hash型別的key設定序列化 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); //為hash型別的value設定序列化 redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.setConnectionFactory(lettuceConnectionFactory); return redisTemplate; } // @Bean // public RedisSentinelConfiguration redisSentinelConfiguration() { // RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration() // .master("mymaster") // .sentinel("", 26379) // .sentinel("", 26380) // .sentinel("", 26381); // redisSentinelConfiguration.setPassword(""); // return redisSentinelConfiguration; // } }

5.通過Lettuce對5種資料型別的操作方式

  1 @SpringBootTest
  2 
  3 public class DemoApplicationTests {
  4 
  5     @Autowired
  6     private RedisTemplate redisTemplate;
  7 
  8 //    @Autowired
  9 //    private StringRedisTemplate stringRedisTemplate;
 10 
 11     /**
 12      * 測試連線
 13      */
 14     @Test
 15     public void initConn() {
 16         ValueOperations ops = redisTemplate.opsForValue();
 17         ops.set("name", "zhangsan");
 18 
 19 //        ValueOperations<String, String> stringStringValueOperations = stringRedisTemplate.opsForValue();
 20 //        stringStringValueOperations.set("sex", "男");
 21 //        System.out.println(stringStringValueOperations.get("sex"));
 22     }
 23 
 24     /**
 25      * 測試序列化
 26      */
 27     @Test
 28     public void testSerial() {
 29         User user = new User();
 30         user.setId(1);
 31         user.setName("zhangsan");
 32         user.setAge(20);
 33         ValueOperations ops = redisTemplate.opsForValue();
 34         ops.set("user", user);
 35         Object user1 = ops.get("user");
 36         System.out.println(user1);
 37     }
 38 
 39     /**
 40      * 操作string
 41      */
 42     @Test
 43     public void testString() {
 44         ValueOperations operations = redisTemplate.opsForValue();
 45         //新增一條資料
 46         operations.set("name", "zhangsan");
 47         //獲取一條資料
 48         String name = (String) operations.get("name");
 49         System.out.println(name);
 50         //層級目錄
 51         operations.set("user:01", "lisi");
 52         operations.set("user:02", "wangwu");
 53         //新增多條資料
 54         Map<String, String> map = new HashMap<>();
 55         map.put("age", "20");
 56         map.put("address", "hs");
 57         operations.multiSet(map);
 58         //獲取多條資料
 59         List<String> keys = new ArrayList<>();
 60         keys.add("name");
 61         keys.add("age");
 62         keys.add("address");
 63         List list = operations.multiGet(keys);
 64         list.forEach(System.out::println);
 65         //刪除資料
 66         redisTemplate.delete("name");
 67     }
 68 
 69     /**
 70      * 操作 hash
 71      */
 72     @Test
 73     public void testHash() {
 74         HashOperations hashOperations = redisTemplate.opsForHash();
 75         //新增一條資料
 76         hashOperations.put("user", "name", "zhangsan");
 77         //獲取一條資料
 78         String name = (String) hashOperations.get("user", "name");
 79         System.out.println(name);
 80         //新增多條資料
 81         Map<String, String> map = new HashMap<>();
 82         map.put("age", "20");
 83         map.put("address", "hs");
 84         hashOperations.putAll("user", map);
 85         //獲取多條資料
 86         List<String> keys = new ArrayList<>();
 87         keys.add("name");
 88         keys.add("age");
 89         keys.add("address");
 90         List list = hashOperations.multiGet("user", keys);
 91         list.forEach(System.out::println);
 92         //獲取所有資料
 93         Map<String, String> entries = hashOperations.entries("user");
 94         entries.entrySet().forEach(e -> {
 95             System.out.println(e.getKey() + "-->" + e.getValue());
 96         });
 97         hashOperations.delete("user", "name", "age");
 98     }
 99 
100     /**
101      * 操作列表
102      */
103     @Test
104     public void testList() {
105         ListOperations listOperations = redisTemplate.opsForList();
106         //左新增
107         listOperations.leftPush("students", "wangwu");
108         listOperations.leftPush("students", "lisi");
109         //在v引數左邊插入一個v1引數
110         listOperations.leftPush("students","zhaoliu", "zhangsan");
111         //右新增
112         listOperations.rightPush("students", "zhaoliu");
113         listOperations.rightPush("students", "zhangsan", "aaa");
114         //獲取資料
115         List list = listOperations.range("students", 0, 3);
116         list.forEach(System.out::println);
117         //獲取總條數
118         Long size = listOperations.size("students");
119         System.out.println(size);
120 
121         //刪除1個 lisi
122         listOperations.remove("students", 1, "lisi");
123         //刪除最左邊的
124         listOperations.leftPop("students");
125         //刪除最右邊的
126         listOperations.rightPop("students");
127     }
128 
129     /**
130      * 操作 Set
131      */
132     @Test
133     public void testSet() {
134         SetOperations setOperations = redisTemplate.opsForSet();
135         //新增資料
136         String[] letters = new String[]{"aaa", "bbb", "ccc"};
137         setOperations.add("letters", letters);
138         //獲取資料
139         Set set = setOperations.members("letters");
140         set.forEach(System.out::println);
141         setOperations.remove("letters", "aaa", "bbb");
142     }
143 
144     @Test
145     public void testSortedSet() {
146         ZSetOperations zSetOperations = redisTemplate.opsForZSet();
147         //新增資料
148         ZSetOperations.TypedTuple<Object> objectTypedTuple1 = new DefaultTypedTuple<>("zhangsan", 7D);
149         ZSetOperations.TypedTuple<Object> objectTypedTuple2 = new DefaultTypedTuple<>("lisi", 3D);
150         ZSetOperations.TypedTuple<Object> objectTypedTuple3 = new DefaultTypedTuple<>("wangwu", 5D);
151         ZSetOperations.TypedTuple<Object> objectTypedTuple4 = new DefaultTypedTuple<>("zhaoliu", 1D);
152         ZSetOperations.TypedTuple<Object> objectTypedTuple5 = new DefaultTypedTuple<>("tyyianqi", 10D);
153         Set<ZSetOperations.TypedTuple<Object>> tuples = new HashSet<>();
154         tuples.add(objectTypedTuple1);
155         tuples.add(objectTypedTuple2);
156         tuples.add(objectTypedTuple3);
157         tuples.add(objectTypedTuple4);
158         tuples.add(objectTypedTuple5);
159         zSetOperations.add("score", tuples);
160 
161         //獲取資料
162         Set set = zSetOperations.range("score", 0, 100);
163         set.forEach(System.out::println);
164         //獲取總條數
165         Long size = zSetOperations.size("score");
166         System.out.println(size);
167         //刪除
168         zSetOperations.remove("score", "zhangsan", "lisi");
169     }
170 
171     /**
172      * 所處當前資料庫中所有的 key
173      */
174     @Test
175     public void testAllKey() {
176         //獲取當前資料庫所有key
177         Set keys = redisTemplate.keys("*");
178         keys.forEach(System.out::println);
179     }
180 
181     /**
182      * 失效時間
183      */
184     @Test
185     public void testExpire() {
186         ValueOperations ops = redisTemplate.opsForValue();
187         //方法一 ,新增key的時候設定失效時間
188         ops.set("code", "test", 30, TimeUnit.SECONDS);
189         //方法二,給已經存在的key設定失效時間
190         redisTemplate.expire("address", 30, TimeUnit.SECONDS);
191         //檢視失效時間
192         Long expire = redisTemplate.getExpire("code");
193         System.out.println(expire);
194 
195     }
196 }
View Code