一、安装

官网下载,打开redis.conf原文件修改(为了方便挂载!)

  1. bind 127.0.0.1 #注释掉这部分,使redis可以外部访问
  2. daemonize no#用守护线程的方式启动
  3. requirepass 你的密码#给redis设置密码
  4. appendonly yes #redis持久化  默认是no
  5. tcp-keepalive 300 #防止出现远程主机强迫关闭了一个现有的连接的错误 默认是300

-p 6379:6379:把容器内的6379端口映射到宿主机6379端口
-v /root/redis/redis.conf:/etc/redis/redis.conf:把宿主机配置好的redis.conf放到容器内的这个位置中
-v /root/redis/data:/data:把redis持久化的数据在宿主机内显示,做数据备份
redis-server /etc/redis/redis.conf:这个是关键配置,让redis不是无配置启动,而是按照这个redis.conf的配置启动
–appendonly yes:redis启动后数据持久化(很关键,不然退出redis服务后数据就没有了)

也可以部修改,在创建容器的时候多加,如: redis-server /etc/redis/redis.conf --appendonly yes也可以~

这里配置里 daemonize no 不能写为yes,否者redis的docker启动不起!!!

创建容器

  1. docker run --name=redis-test -p 6379:6379 -v /opt/docker/redis/redis.conf:/etc/redis/redis.conf -v /opt/docker/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes

二、使用

1. 客户端控制台操作

进入docker容器,操作redis

  1. #进入容器
  2. docker exec -it redis-test /bin/bash
  3. #访问redis
  4. redis-cli
  5. #登录
  6. auth 123456

简单测试创建一个{key:name,value:”mytest”}

  1. 127.0.0.1:6379> set name mytest
  2. OK
  3. 127.0.0.1:6379> get name
  4. "mytest"

image.png

2. SpringBoot 整合Redis

1. Maven依赖

pom.xml

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-test</artifactId>
  9. <scope>test</scope>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-data-redis</artifactId>
  14. </dependency>
  15. <dependency>
  16. <groupId>org.apache.commons</groupId>
  17. <artifactId>commons-pool2</artifactId>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.projectlombok</groupId>
  21. <artifactId>lombok</artifactId>
  22. </dependency>
  23. </dependencies>

2. 创建实体类

实现序列化接口,否则存不进去

  1. package com.jili.redistest.entity;
  2. import lombok.Data;
  3. import java.io.Serializable;
  4. import java.util.Date;
  5. /**
  6. * @author: Jili
  7. * @date: Created on 2021/7/9 17:12
  8. */
  9. @Data
  10. public class Student implements Serializable {
  11. private Integer id;
  12. private String name;
  13. private Double score;
  14. private Date birthday;
  15. }

3. 创建控制器

  1. package com.jili.redistest.controller;
  2. import com.jili.redistest.entity.Student;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.data.redis.core.RedisTemplate;
  5. import org.springframework.web.bind.annotation.*;
  6. /**
  7. * @author: Jili
  8. * @date: Created on 2021/7/9 17:21
  9. */
  10. @RestController
  11. public class StudentController {
  12. @Autowired
  13. private RedisTemplate redisTemplate;
  14. @GetMapping("/test")
  15. public String getTest() {
  16. return "Test!";
  17. }
  18. @PostMapping("/setRedis")
  19. public void setRedis(@RequestBody Student student) {
  20. redisTemplate.opsForValue().set("student", student);
  21. }
  22. @GetMapping("/setRedisS")
  23. public void setRedisS() {
  24. Student student=new Student();
  25. student.setId(0001);
  26. student.setName("test");
  27. redisTemplate.opsForValue().set("student", student);
  28. }
  29. @GetMapping("/getRedis/{key}")
  30. public String getRedis(@PathVariable("key") String key) {
  31. Object object = redisTemplate.opsForValue().get(key);
  32. return String.valueOf(object);
  33. }
  34. @GetMapping("/getS")
  35. public String getS() {
  36. Object object = redisTemplate.opsForValue().get("name");
  37. return String.valueOf(object);
  38. }
  39. }

4. yml配置

application.yaml

  1. spring:
  2. redis:
  3. database: 0
  4. host: 116.62.41.96
  5. port: 6379
  6. password: 123456

源码:https://gitee.com/jili_lyj/redis-test

三、 技巧

这里根据实际的生产环境总结一下在真实项目里的使用技巧

工具类

RedisUtil
这里使用StringRedisTemplate来代替RedisTemplate实现序列化

  1. package com.orisdom.utils;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.data.redis.connection.DataType;
  4. import org.springframework.data.redis.core.Cursor;
  5. import org.springframework.data.redis.core.ScanOptions;
  6. import org.springframework.data.redis.core.StringRedisTemplate;
  7. import org.springframework.data.redis.core.ZSetOperations.TypedTuple;
  8. import org.springframework.stereotype.Component;
  9. import java.util.*;
  10. import java.util.Map.Entry;
  11. import java.util.concurrent.TimeUnit;
  12. /**
  13. * Redis工具类
  14. *
  15. * @author xiaokangchen
  16. * @date 2018-02-24 下午03:09:50
  17. * @version 1.1
  18. */
  19. @Component
  20. public class RedisUtil {
  21. @Autowired
  22. private StringRedisTemplate redisTemplate;
  23. public void setRedisTemplate(StringRedisTemplate redisTemplate) {
  24. this.redisTemplate = redisTemplate;
  25. }
  26. public StringRedisTemplate getRedisTemplate() {
  27. return this.redisTemplate;
  28. }
  29. /** -------------------key相关操作--------------------- */
  30. /**
  31. * 删除key
  32. *
  33. * @param key
  34. */
  35. public void delete(String key) {
  36. redisTemplate.delete(key);
  37. }
  38. /**
  39. * 批量删除key
  40. *
  41. * @param keys
  42. */
  43. public void delete(Collection<String> keys) {
  44. redisTemplate.delete(keys);
  45. }
  46. /**
  47. * 序列化key
  48. *
  49. * @param key
  50. * @return
  51. */
  52. public byte[] dump(String key) {
  53. return redisTemplate.dump(key);
  54. }
  55. /**
  56. * 是否存在key
  57. *
  58. * @param key
  59. * @return
  60. */
  61. public Boolean hasKey(String key) {
  62. return redisTemplate.hasKey(key);
  63. }
  64. /**
  65. * 设置过期时间
  66. *
  67. * @param key
  68. * @param timeout
  69. * @param unit
  70. * @return
  71. */
  72. public Boolean expire(String key, long timeout, TimeUnit unit) {
  73. return redisTemplate.expire(key, timeout, unit);
  74. }
  75. /**
  76. * 设置过期时间
  77. *
  78. * @param key
  79. * @param date
  80. * @return
  81. */
  82. public Boolean expireAt(String key, Date date) {
  83. return redisTemplate.expireAt(key, date);
  84. }
  85. /**
  86. * 查找匹配的key
  87. *
  88. * @param pattern
  89. * @return
  90. */
  91. public Set<String> keys(String pattern) {
  92. return redisTemplate.keys(pattern);
  93. }
  94. /**
  95. * 将当前数据库的 key 移动到给定的数据库 db 当中
  96. *
  97. * @param key
  98. * @param dbIndex
  99. * @return
  100. */
  101. public Boolean move(String key, int dbIndex) {
  102. return redisTemplate.move(key, dbIndex);
  103. }
  104. /**
  105. * 移除 key 的过期时间,key 将持久保持
  106. *
  107. * @param key
  108. * @return
  109. */
  110. public Boolean persist(String key) {
  111. return redisTemplate.persist(key);
  112. }
  113. /**
  114. * 返回 key 的剩余的过期时间
  115. *
  116. * @param key
  117. * @param unit
  118. * @return
  119. */
  120. public Long getExpire(String key, TimeUnit unit) {
  121. return redisTemplate.getExpire(key, unit);
  122. }
  123. /**
  124. * 返回 key 的剩余的过期时间
  125. *
  126. * @param key
  127. * @return
  128. */
  129. public Long getExpire(String key) {
  130. return redisTemplate.getExpire(key);
  131. }
  132. /**
  133. * 从当前数据库中随机返回一个 key
  134. *
  135. * @return
  136. */
  137. public String randomKey() {
  138. return redisTemplate.randomKey();
  139. }
  140. /**
  141. * 修改 key 的名称
  142. *
  143. * @param oldKey
  144. * @param newKey
  145. */
  146. public void rename(String oldKey, String newKey) {
  147. redisTemplate.rename(oldKey, newKey);
  148. }
  149. /**
  150. * 仅当 newkey 不存在时,将 oldKey 改名为 newkey
  151. *
  152. * @param oldKey
  153. * @param newKey
  154. * @return
  155. */
  156. public Boolean renameIfAbsent(String oldKey, String newKey) {
  157. return redisTemplate.renameIfAbsent(oldKey, newKey);
  158. }
  159. /**
  160. * 返回 key 所储存的值的类型
  161. *
  162. * @param key
  163. * @return
  164. */
  165. public DataType type(String key) {
  166. return redisTemplate.type(key);
  167. }
  168. /** -------------------string相关操作--------------------- */
  169. /**
  170. * 设置指定 key 的值
  171. * @param key
  172. * @param value
  173. */
  174. public void set(String key, String value) {
  175. redisTemplate.opsForValue().set(key, value);
  176. }
  177. /**
  178. * 获取指定 key 的值
  179. * @param key
  180. * @return
  181. */
  182. public String get(String key) {
  183. return redisTemplate.opsForValue().get(key);
  184. }
  185. /**
  186. * 返回 key 中字符串值的子字符
  187. * @param key
  188. * @param start
  189. * @param end
  190. * @return
  191. */
  192. public String getRange(String key, long start, long end) {
  193. return redisTemplate.opsForValue().get(key, start, end);
  194. }
  195. /**
  196. * 将给定 key 的值设为 value ,并返回 key 的旧值(old value)
  197. *
  198. * @param key
  199. * @param value
  200. * @return
  201. */
  202. public String getAndSet(String key, String value) {
  203. return redisTemplate.opsForValue().getAndSet(key, value);
  204. }
  205. /**
  206. * 对 key 所储存的字符串值,获取指定偏移量上的位(bit)
  207. *
  208. * @param key
  209. * @param offset
  210. * @return
  211. */
  212. public Boolean getBit(String key, long offset) {
  213. return redisTemplate.opsForValue().getBit(key, offset);
  214. }
  215. /**
  216. * 批量获取
  217. *
  218. * @param keys
  219. * @return
  220. */
  221. public List<String> multiGet(Collection<String> keys) {
  222. return redisTemplate.opsForValue().multiGet(keys);
  223. }
  224. /**
  225. * 设置ASCII码, 字符串'a'的ASCII码是97, 转为二进制是'01100001', 此方法是将二进制第offset位值变为value
  226. *
  227. * @param key
  228. * @param offset 位置
  229. * @param value 值,true为1, false为0
  230. * @return
  231. */
  232. public boolean setBit(String key, long offset, boolean value) {
  233. return redisTemplate.opsForValue().setBit(key, offset, value);
  234. }
  235. /**
  236. * 将值 value 关联到 key ,并将 key 的过期时间设为 timeout
  237. *
  238. * @param key
  239. * @param value
  240. * @param timeout
  241. * 过期时间
  242. * @param unit
  243. * 时间单位, 天:TimeUnit.DAYS 小时:TimeUnit.HOURS 分钟:TimeUnit.MINUTES
  244. * 秒:TimeUnit.SECONDS 毫秒:TimeUnit.MILLISECONDS
  245. */
  246. public void setEx(String key, String value, long timeout, TimeUnit unit) {
  247. redisTemplate.opsForValue().set(key, value, timeout, unit);
  248. }
  249. /**
  250. * 只有在 key 不存在时设置 key 的值
  251. *
  252. * @param key
  253. * @param value
  254. * @return 之前已经存在返回false,不存在返回true
  255. */
  256. public boolean setIfAbsent(String key, String value) {
  257. return redisTemplate.opsForValue().setIfAbsent(key, value);
  258. }
  259. /**
  260. * 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始
  261. *
  262. * @param key
  263. * @param value
  264. * @param offset
  265. * 从指定位置开始覆写
  266. */
  267. public void setRange(String key, String value, long offset) {
  268. redisTemplate.opsForValue().set(key, value, offset);
  269. }
  270. /**
  271. * 获取字符串的长度
  272. *
  273. * @param key
  274. * @return
  275. */
  276. public Long size(String key) {
  277. return redisTemplate.opsForValue().size(key);
  278. }
  279. /**
  280. * 批量添加
  281. *
  282. * @param maps
  283. */
  284. public void multiSet(Map<String, String> maps) {
  285. redisTemplate.opsForValue().multiSet(maps);
  286. }
  287. /**
  288. * 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
  289. *
  290. * @param maps
  291. * @return 之前已经存在返回false,不存在返回true
  292. */
  293. public boolean multiSetIfAbsent(Map<String, String> maps) {
  294. return redisTemplate.opsForValue().multiSetIfAbsent(maps);
  295. }
  296. /**
  297. * 增加(自增长), 负数则为自减
  298. *
  299. * @param key
  300. * @param increment
  301. * @return
  302. */
  303. public Long incrBy(String key, long increment) {
  304. return redisTemplate.opsForValue().increment(key, increment);
  305. }
  306. /**
  307. *
  308. * @param key
  309. * @param increment
  310. * @return
  311. */
  312. public Double incrByFloat(String key, double increment) {
  313. return redisTemplate.opsForValue().increment(key, increment);
  314. }
  315. /**
  316. * 追加到末尾
  317. *
  318. * @param key
  319. * @param value
  320. * @return
  321. */
  322. public Integer append(String key, String value) {
  323. return redisTemplate.opsForValue().append(key, value);
  324. }
  325. /** -------------------hash相关操作------------------------- */
  326. /**
  327. * 获取存储在哈希表中指定字段的值
  328. *
  329. * @param key
  330. * @param field
  331. * @return
  332. */
  333. public Object hGet(String key, String field) {
  334. return redisTemplate.opsForHash().get(key, field);
  335. }
  336. /**
  337. * 获取所有给定字段的值
  338. *
  339. * @param key
  340. * @return
  341. */
  342. public Map<Object, Object> hGetAll(String key) {
  343. return redisTemplate.opsForHash().entries(key);
  344. }
  345. /**
  346. * 获取所有给定字段的值
  347. *
  348. * @param key
  349. * @param fields
  350. * @return
  351. */
  352. public List<Object> hMultiGet(String key, Collection<Object> fields) {
  353. return redisTemplate.opsForHash().multiGet(key, fields);
  354. }
  355. public void hPut(String key, String hashKey, String value) {
  356. redisTemplate.opsForHash().put(key, hashKey, value);
  357. }
  358. public void hPutAll(String key, Map<String, String> maps) {
  359. redisTemplate.opsForHash().putAll(key, maps);
  360. }
  361. /**
  362. * 仅当hashKey不存在时才设置
  363. *
  364. * @param key
  365. * @param hashKey
  366. * @param value
  367. * @return
  368. */
  369. public Boolean hPutIfAbsent(String key, String hashKey, String value) {
  370. return redisTemplate.opsForHash().putIfAbsent(key, hashKey, value);
  371. }
  372. /**
  373. * 删除一个或多个哈希表字段
  374. *
  375. * @param key
  376. * @param fields
  377. * @return
  378. */
  379. public Long hDelete(String key, Object... fields) {
  380. return redisTemplate.opsForHash().delete(key, fields);
  381. }
  382. /**
  383. * 查看哈希表 key 中,指定的字段是否存在
  384. *
  385. * @param key
  386. * @param field
  387. * @return
  388. */
  389. public boolean hExists(String key, String field) {
  390. return redisTemplate.opsForHash().hasKey(key, field);
  391. }
  392. /**
  393. * 为哈希表 key 中的指定字段的整数值加上增量 increment
  394. *
  395. * @param key
  396. * @param field
  397. * @param increment
  398. * @return
  399. */
  400. public Long hIncrBy(String key, Object field, long increment) {
  401. return redisTemplate.opsForHash().increment(key, field, increment);
  402. }
  403. /**
  404. * 为哈希表 key 中的指定字段的整数值加上增量 increment
  405. *
  406. * @param key
  407. * @param field
  408. * @param delta
  409. * @return
  410. */
  411. public Double hIncrByFloat(String key, Object field, double delta) {
  412. return redisTemplate.opsForHash().increment(key, field, delta);
  413. }
  414. /**
  415. * 获取所有哈希表中的字段
  416. *
  417. * @param key
  418. * @return
  419. */
  420. public Set<Object> hKeys(String key) {
  421. return redisTemplate.opsForHash().keys(key);
  422. }
  423. /**
  424. * 获取哈希表中字段的数量
  425. *
  426. * @param key
  427. * @return
  428. */
  429. public Long hSize(String key) {
  430. return redisTemplate.opsForHash().size(key);
  431. }
  432. /**
  433. * 获取哈希表中所有值
  434. *
  435. * @param key
  436. * @return
  437. */
  438. public List<Object> hValues(String key) {
  439. return redisTemplate.opsForHash().values(key);
  440. }
  441. /**
  442. * 迭代哈希表中的键值对
  443. *
  444. * @param key
  445. * @param options
  446. * @return
  447. */
  448. public Cursor<Entry<Object, Object>> hScan(String key, ScanOptions options) {
  449. return redisTemplate.opsForHash().scan(key, options);
  450. }
  451. /** ------------------------list相关操作---------------------------- */
  452. /**
  453. * 通过索引获取列表中的元素
  454. *
  455. * @param key
  456. * @param index
  457. * @return
  458. */
  459. public String lIndex(String key, long index) {
  460. return redisTemplate.opsForList().index(key, index);
  461. }
  462. /**
  463. * 获取列表指定范围内的元素
  464. *
  465. * @param key
  466. * @param start
  467. * 开始位置, 0是开始位置
  468. * @param end
  469. * 结束位置, -1返回所有
  470. * @return
  471. */
  472. public List<String> lRange(String key, long start, long end) {
  473. return redisTemplate.opsForList().range(key, start, end);
  474. }
  475. /**
  476. * 存储在list头部
  477. *
  478. * @param key
  479. * @param value
  480. * @return
  481. */
  482. public Long lLeftPush(String key, String value) {
  483. return redisTemplate.opsForList().leftPush(key, value);
  484. }
  485. /**
  486. *
  487. * @param key
  488. * @param value
  489. * @return
  490. */
  491. public Long lLeftPushAll(String key, String... value) {
  492. return redisTemplate.opsForList().leftPushAll(key, value);
  493. }
  494. /**
  495. *
  496. * @param key
  497. * @param value
  498. * @return
  499. */
  500. public Long lLeftPushAll(String key, Collection<String> value) {
  501. return redisTemplate.opsForList().leftPushAll(key, value);
  502. }
  503. /**
  504. * 当list存在的时候才加入
  505. *
  506. * @param key
  507. * @param value
  508. * @return
  509. */
  510. public Long lLeftPushIfPresent(String key, String value) {
  511. return redisTemplate.opsForList().leftPushIfPresent(key, value);
  512. }
  513. /**
  514. * 如果pivot存在,再pivot前面添加
  515. *
  516. * @param key
  517. * @param pivot
  518. * @param value
  519. * @return
  520. */
  521. public Long lLeftPush(String key, String pivot, String value) {
  522. return redisTemplate.opsForList().leftPush(key, pivot, value);
  523. }
  524. /**
  525. *
  526. * @param key
  527. * @param value
  528. * @return
  529. */
  530. public Long lRightPush(String key, String value) {
  531. return redisTemplate.opsForList().rightPush(key, value);
  532. }
  533. /**
  534. *
  535. * @param key
  536. * @param value
  537. * @return
  538. */
  539. public Long lRightPushAll(String key, String... value) {
  540. return redisTemplate.opsForList().rightPushAll(key, value);
  541. }
  542. /**
  543. *
  544. * @param key
  545. * @param value
  546. * @return
  547. */
  548. public Long lRightPushAll(String key, Collection<String> value) {
  549. return redisTemplate.opsForList().rightPushAll(key, value);
  550. }
  551. /**
  552. * 为已存在的列表添加值
  553. *
  554. * @param key
  555. * @param value
  556. * @return
  557. */
  558. public Long lRightPushIfPresent(String key, String value) {
  559. return redisTemplate.opsForList().rightPushIfPresent(key, value);
  560. }
  561. /**
  562. * 在pivot元素的右边添加值
  563. *
  564. * @param key
  565. * @param pivot
  566. * @param value
  567. * @return
  568. */
  569. public Long lRightPush(String key, String pivot, String value) {
  570. return redisTemplate.opsForList().rightPush(key, pivot, value);
  571. }
  572. /**
  573. * 通过索引设置列表元素的值
  574. *
  575. * @param key
  576. * @param index
  577. * 位置
  578. * @param value
  579. */
  580. public void lSet(String key, long index, String value) {
  581. redisTemplate.opsForList().set(key, index, value);
  582. }
  583. /**
  584. * 移出并获取列表的第一个元素
  585. *
  586. * @param key
  587. * @return 删除的元素
  588. */
  589. public String lLeftPop(String key) {
  590. return redisTemplate.opsForList().leftPop(key);
  591. }
  592. /**
  593. * 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
  594. *
  595. * @param key
  596. * @param timeout
  597. * 等待时间
  598. * @param unit
  599. * 时间单位
  600. * @return
  601. */
  602. public String lBLeftPop(String key, long timeout, TimeUnit unit) {
  603. return redisTemplate.opsForList().leftPop(key, timeout, unit);
  604. }
  605. /**
  606. * 移除并获取列表最后一个元素
  607. *
  608. * @param key
  609. * @return 删除的元素
  610. */
  611. public String lRightPop(String key) {
  612. return redisTemplate.opsForList().rightPop(key);
  613. }
  614. /**
  615. * 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
  616. *
  617. * @param key
  618. * @param timeout
  619. * 等待时间
  620. * @param unit
  621. * 时间单位
  622. * @return
  623. */
  624. public String lBRightPop(String key, long timeout, TimeUnit unit) {
  625. return redisTemplate.opsForList().rightPop(key, timeout, unit);
  626. }
  627. /**
  628. * 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
  629. *
  630. * @param sourceKey
  631. * @param destinationKey
  632. * @return
  633. */
  634. public String lRightPopAndLeftPush(String sourceKey, String destinationKey) {
  635. return redisTemplate.opsForList().rightPopAndLeftPush(sourceKey,
  636. destinationKey);
  637. }
  638. /**
  639. * 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
  640. *
  641. * @param sourceKey
  642. * @param destinationKey
  643. * @param timeout
  644. * @param unit
  645. * @return
  646. */
  647. public String lBRightPopAndLeftPush(String sourceKey, String destinationKey,
  648. long timeout, TimeUnit unit) {
  649. return redisTemplate.opsForList().rightPopAndLeftPush(sourceKey,
  650. destinationKey, timeout, unit);
  651. }
  652. /**
  653. * 删除集合中值等于value得元素
  654. *
  655. * @param key
  656. * @param index
  657. * index=0, 删除所有值等于value的元素; index>0, 从头部开始删除第一个值等于value的元素;
  658. * index<0, 从尾部开始删除第一个值等于value的元素;
  659. * @param value
  660. * @return
  661. */
  662. public Long lRemove(String key, long index, String value) {
  663. return redisTemplate.opsForList().remove(key, index, value);
  664. }
  665. /**
  666. * 裁剪list
  667. *
  668. * @param key
  669. * @param start
  670. * @param end
  671. */
  672. public void lTrim(String key, long start, long end) {
  673. redisTemplate.opsForList().trim(key, start, end);
  674. }
  675. /**
  676. * 获取列表长度
  677. *
  678. * @param key
  679. * @return
  680. */
  681. public Long lLen(String key) {
  682. return redisTemplate.opsForList().size(key);
  683. }
  684. /** --------------------set相关操作-------------------------- */
  685. /**
  686. * set添加元素
  687. *
  688. * @param key
  689. * @param values
  690. * @return
  691. */
  692. public Long sAdd(String key, String... values) {
  693. return redisTemplate.opsForSet().add(key, values);
  694. }
  695. /**
  696. * set移除元素
  697. *
  698. * @param key
  699. * @param values
  700. * @return
  701. */
  702. public Long sRemove(String key, Object... values) {
  703. return redisTemplate.opsForSet().remove(key, values);
  704. }
  705. /**
  706. * 移除并返回集合的一个随机元素
  707. *
  708. * @param key
  709. * @return
  710. */
  711. public String sPop(String key) {
  712. return redisTemplate.opsForSet().pop(key);
  713. }
  714. /**
  715. * 将元素value从一个集合移到另一个集合
  716. *
  717. * @param key
  718. * @param value
  719. * @param destKey
  720. * @return
  721. */
  722. public Boolean sMove(String key, String value, String destKey) {
  723. return redisTemplate.opsForSet().move(key, value, destKey);
  724. }
  725. /**
  726. * 获取集合的大小
  727. *
  728. * @param key
  729. * @return
  730. */
  731. public Long sSize(String key) {
  732. return redisTemplate.opsForSet().size(key);
  733. }
  734. /**
  735. * 判断集合是否包含value
  736. *
  737. * @param key
  738. * @param value
  739. * @return
  740. */
  741. public Boolean sIsMember(String key, Object value) {
  742. return redisTemplate.opsForSet().isMember(key, value);
  743. }
  744. /**
  745. * 获取两个集合的交集
  746. *
  747. * @param key
  748. * @param otherKey
  749. * @return
  750. */
  751. public Set<String> sIntersect(String key, String otherKey) {
  752. return redisTemplate.opsForSet().intersect(key, otherKey);
  753. }
  754. /**
  755. * 获取key集合与多个集合的交集
  756. *
  757. * @param key
  758. * @param otherKeys
  759. * @return
  760. */
  761. public Set<String> sIntersect(String key, Collection<String> otherKeys) {
  762. return redisTemplate.opsForSet().intersect(key, otherKeys);
  763. }
  764. /**
  765. * key集合与otherKey集合的交集存储到destKey集合中
  766. *
  767. * @param key
  768. * @param otherKey
  769. * @param destKey
  770. * @return
  771. */
  772. public Long sIntersectAndStore(String key, String otherKey, String destKey) {
  773. return redisTemplate.opsForSet().intersectAndStore(key, otherKey,
  774. destKey);
  775. }
  776. /**
  777. * key集合与多个集合的交集存储到destKey集合中
  778. *
  779. * @param key
  780. * @param otherKeys
  781. * @param destKey
  782. * @return
  783. */
  784. public Long sIntersectAndStore(String key, Collection<String> otherKeys,
  785. String destKey) {
  786. return redisTemplate.opsForSet().intersectAndStore(key, otherKeys,
  787. destKey);
  788. }
  789. /**
  790. * 获取两个集合的并集
  791. *
  792. * @param key
  793. * @param otherKeys
  794. * @return
  795. */
  796. public Set<String> sUnion(String key, String otherKeys) {
  797. return redisTemplate.opsForSet().union(key, otherKeys);
  798. }
  799. /**
  800. * 获取key集合与多个集合的并集
  801. *
  802. * @param key
  803. * @param otherKeys
  804. * @return
  805. */
  806. public Set<String> sUnion(String key, Collection<String> otherKeys) {
  807. return redisTemplate.opsForSet().union(key, otherKeys);
  808. }
  809. /**
  810. * key集合与otherKey集合的并集存储到destKey中
  811. *
  812. * @param key
  813. * @param otherKey
  814. * @param destKey
  815. * @return
  816. */
  817. public Long sUnionAndStore(String key, String otherKey, String destKey) {
  818. return redisTemplate.opsForSet().unionAndStore(key, otherKey, destKey);
  819. }
  820. /**
  821. * key集合与多个集合的并集存储到destKey中
  822. *
  823. * @param key
  824. * @param otherKeys
  825. * @param destKey
  826. * @return
  827. */
  828. public Long sUnionAndStore(String key, Collection<String> otherKeys,
  829. String destKey) {
  830. return redisTemplate.opsForSet().unionAndStore(key, otherKeys, destKey);
  831. }
  832. /**
  833. * 获取两个集合的差集
  834. *
  835. * @param key
  836. * @param otherKey
  837. * @return
  838. */
  839. public Set<String> sDifference(String key, String otherKey) {
  840. return redisTemplate.opsForSet().difference(key, otherKey);
  841. }
  842. /**
  843. * 获取key集合与多个集合的差集
  844. *
  845. * @param key
  846. * @param otherKeys
  847. * @return
  848. */
  849. public Set<String> sDifference(String key, Collection<String> otherKeys) {
  850. return redisTemplate.opsForSet().difference(key, otherKeys);
  851. }
  852. /**
  853. * key集合与otherKey集合的差集存储到destKey中
  854. *
  855. * @param key
  856. * @param otherKey
  857. * @param destKey
  858. * @return
  859. */
  860. public Long sDifference(String key, String otherKey, String destKey) {
  861. return redisTemplate.opsForSet().differenceAndStore(key, otherKey,
  862. destKey);
  863. }
  864. /**
  865. * key集合与多个集合的差集存储到destKey中
  866. *
  867. * @param key
  868. * @param otherKeys
  869. * @param destKey
  870. * @return
  871. */
  872. public Long sDifference(String key, Collection<String> otherKeys,
  873. String destKey) {
  874. return redisTemplate.opsForSet().differenceAndStore(key, otherKeys,
  875. destKey);
  876. }
  877. /**
  878. * 获取集合所有元素
  879. *
  880. * @param key
  881. * @return
  882. */
  883. public Set<String> setMembers(String key) {
  884. return redisTemplate.opsForSet().members(key);
  885. }
  886. /**
  887. * 随机获取集合中的一个元素
  888. *
  889. * @param key
  890. * @return
  891. */
  892. public String sRandomMember(String key) {
  893. return redisTemplate.opsForSet().randomMember(key);
  894. }
  895. /**
  896. * 随机获取集合中count个元素
  897. *
  898. * @param key
  899. * @param count
  900. * @return
  901. */
  902. public List<String> sRandomMembers(String key, long count) {
  903. return redisTemplate.opsForSet().randomMembers(key, count);
  904. }
  905. /**
  906. * 随机获取集合中count个元素并且去除重复的
  907. *
  908. * @param key
  909. * @param count
  910. * @return
  911. */
  912. public Set<String> sDistinctRandomMembers(String key, long count) {
  913. return redisTemplate.opsForSet().distinctRandomMembers(key, count);
  914. }
  915. /**
  916. *
  917. * @param key
  918. * @param options
  919. * @return
  920. */
  921. public Cursor<String> sScan(String key, ScanOptions options) {
  922. return redisTemplate.opsForSet().scan(key, options);
  923. }
  924. /**------------------zSet相关操作--------------------------------*/
  925. /**
  926. * 添加元素,有序集合是按照元素的score值由小到大排列
  927. *
  928. * @param key
  929. * @param value
  930. * @param score
  931. * @return
  932. */
  933. public Boolean zAdd(String key, String value, double score) {
  934. return redisTemplate.opsForZSet().add(key, value, score);
  935. }
  936. /**
  937. *
  938. * @param key
  939. * @param values
  940. * @return
  941. */
  942. public Long zAdd(String key, Set<TypedTuple<String>> values) {
  943. return redisTemplate.opsForZSet().add(key, values);
  944. }
  945. /**
  946. *
  947. * @param key
  948. * @param values
  949. * @return
  950. */
  951. public Long zRemove(String key, Object... values) {
  952. return redisTemplate.opsForZSet().remove(key, values);
  953. }
  954. /**
  955. * 增加元素的score值,并返回增加后的值
  956. *
  957. * @param key
  958. * @param value
  959. * @param delta
  960. * @return
  961. */
  962. public Double zIncrementScore(String key, String value, double delta) {
  963. return redisTemplate.opsForZSet().incrementScore(key, value, delta);
  964. }
  965. /**
  966. * 返回元素在集合的排名,有序集合是按照元素的score值由小到大排列
  967. *
  968. * @param key
  969. * @param value
  970. * @return 0表示第一位
  971. */
  972. public Long zRank(String key, Object value) {
  973. return redisTemplate.opsForZSet().rank(key, value);
  974. }
  975. /**
  976. * 返回元素在集合的排名,按元素的score值由大到小排列
  977. *
  978. * @param key
  979. * @param value
  980. * @return
  981. */
  982. public Long zReverseRank(String key, Object value) {
  983. return redisTemplate.opsForZSet().reverseRank(key, value);
  984. }
  985. /**
  986. * 获取集合的元素, 从小到大排序
  987. *
  988. * @param key
  989. * @param start
  990. * 开始位置
  991. * @param end
  992. * 结束位置, -1查询所有
  993. * @return
  994. */
  995. public Set<String> zRange(String key, long start, long end) {
  996. return redisTemplate.opsForZSet().range(key, start, end);
  997. }
  998. /**
  999. * 获取集合元素, 并且把score值也获取
  1000. *
  1001. * @param key
  1002. * @param start
  1003. * @param end
  1004. * @return
  1005. */
  1006. public Set<TypedTuple<String>> zRangeWithScores(String key, long start,
  1007. long end) {
  1008. return redisTemplate.opsForZSet().rangeWithScores(key, start, end);
  1009. }
  1010. /**
  1011. * 根据Score值查询集合元素
  1012. *
  1013. * @param key
  1014. * @param min
  1015. * 最小值
  1016. * @param max
  1017. * 最大值
  1018. * @return
  1019. */
  1020. public Set<String> zRangeByScore(String key, double min, double max) {
  1021. return redisTemplate.opsForZSet().rangeByScore(key, min, max);
  1022. }
  1023. /**
  1024. * 根据Score值查询集合元素, 从小到大排序
  1025. *
  1026. * @param key
  1027. * @param min
  1028. * 最小值
  1029. * @param max
  1030. * 最大值
  1031. * @return
  1032. */
  1033. public Set<TypedTuple<String>> zRangeByScoreWithScores(String key,
  1034. double min, double max) {
  1035. return redisTemplate.opsForZSet().rangeByScoreWithScores(key, min, max);
  1036. }
  1037. /**
  1038. *
  1039. * @param key
  1040. * @param min
  1041. * @param max
  1042. * @param start
  1043. * @param end
  1044. * @return
  1045. */
  1046. public Set<TypedTuple<String>> zRangeByScoreWithScores(String key,
  1047. double min, double max, long start, long end) {
  1048. return redisTemplate.opsForZSet().rangeByScoreWithScores(key, min, max,
  1049. start, end);
  1050. }
  1051. /**
  1052. * 获取集合的元素, 从大到小排序
  1053. *
  1054. * @param key
  1055. * @param start
  1056. * @param end
  1057. * @return
  1058. */
  1059. public Set<String> zReverseRange(String key, long start, long end) {
  1060. return redisTemplate.opsForZSet().reverseRange(key, start, end);
  1061. }
  1062. /**
  1063. * 获取集合的元素, 从大到小排序, 并返回score值
  1064. *
  1065. * @param key
  1066. * @param start
  1067. * @param end
  1068. * @return
  1069. */
  1070. public Set<TypedTuple<String>> zReverseRangeWithScores(String key,
  1071. long start, long end) {
  1072. return redisTemplate.opsForZSet().reverseRangeWithScores(key, start,
  1073. end);
  1074. }
  1075. /**
  1076. * 根据Score值查询集合元素, 从大到小排序
  1077. *
  1078. * @param key
  1079. * @param min
  1080. * @param max
  1081. * @return
  1082. */
  1083. public Set<String> zReverseRangeByScore(String key, double min,
  1084. double max) {
  1085. return redisTemplate.opsForZSet().reverseRangeByScore(key, min, max);
  1086. }
  1087. /**
  1088. * 根据Score值查询集合元素, 从大到小排序
  1089. *
  1090. * @param key
  1091. * @param min
  1092. * @param max
  1093. * @return
  1094. */
  1095. public Set<TypedTuple<String>> zReverseRangeByScoreWithScores(
  1096. String key, double min, double max) {
  1097. return redisTemplate.opsForZSet().reverseRangeByScoreWithScores(key,
  1098. min, max);
  1099. }
  1100. /**
  1101. *
  1102. * @param key
  1103. * @param min
  1104. * @param max
  1105. * @param start
  1106. * @param end
  1107. * @return
  1108. */
  1109. public Set<String> zReverseRangeByScore(String key, double min,
  1110. double max, long start, long end) {
  1111. return redisTemplate.opsForZSet().reverseRangeByScore(key, min, max,
  1112. start, end);
  1113. }
  1114. /**
  1115. * 根据score值获取集合元素数量
  1116. *
  1117. * @param key
  1118. * @param min
  1119. * @param max
  1120. * @return
  1121. */
  1122. public Long zCount(String key, double min, double max) {
  1123. return redisTemplate.opsForZSet().count(key, min, max);
  1124. }
  1125. /**
  1126. * 获取集合大小
  1127. *
  1128. * @param key
  1129. * @return
  1130. */
  1131. public Long zSize(String key) {
  1132. return redisTemplate.opsForZSet().size(key);
  1133. }
  1134. /**
  1135. * 获取集合大小
  1136. *
  1137. * @param key
  1138. * @return
  1139. */
  1140. public Long zZCard(String key) {
  1141. return redisTemplate.opsForZSet().zCard(key);
  1142. }
  1143. /**
  1144. * 获取集合中value元素的score值
  1145. *
  1146. * @param key
  1147. * @param value
  1148. * @return
  1149. */
  1150. public Double zScore(String key, Object value) {
  1151. return redisTemplate.opsForZSet().score(key, value);
  1152. }
  1153. /**
  1154. * 移除指定索引位置的成员
  1155. *
  1156. * @param key
  1157. * @param start
  1158. * @param end
  1159. * @return
  1160. */
  1161. public Long zRemoveRange(String key, long start, long end) {
  1162. return redisTemplate.opsForZSet().removeRange(key, start, end);
  1163. }
  1164. /**
  1165. * 根据指定的score值的范围来移除成员
  1166. *
  1167. * @param key
  1168. * @param min
  1169. * @param max
  1170. * @return
  1171. */
  1172. public Long zRemoveRangeByScore(String key, double min, double max) {
  1173. return redisTemplate.opsForZSet().removeRangeByScore(key, min, max);
  1174. }
  1175. /**
  1176. * 获取key和otherKey的并集并存储在destKey中
  1177. *
  1178. * @param key
  1179. * @param otherKey
  1180. * @param destKey
  1181. * @return
  1182. */
  1183. public Long zUnionAndStore(String key, String otherKey, String destKey) {
  1184. return redisTemplate.opsForZSet().unionAndStore(key, otherKey, destKey);
  1185. }
  1186. /**
  1187. *
  1188. * @param key
  1189. * @param otherKeys
  1190. * @param destKey
  1191. * @return
  1192. */
  1193. public Long zUnionAndStore(String key, Collection<String> otherKeys,
  1194. String destKey) {
  1195. return redisTemplate.opsForZSet()
  1196. .unionAndStore(key, otherKeys, destKey);
  1197. }
  1198. /**
  1199. * 交集
  1200. *
  1201. * @param key
  1202. * @param otherKey
  1203. * @param destKey
  1204. * @return
  1205. */
  1206. public Long zIntersectAndStore(String key, String otherKey,
  1207. String destKey) {
  1208. return redisTemplate.opsForZSet().intersectAndStore(key, otherKey,
  1209. destKey);
  1210. }
  1211. /**
  1212. * 交集
  1213. *
  1214. * @param key
  1215. * @param otherKeys
  1216. * @param destKey
  1217. * @return
  1218. */
  1219. public Long zIntersectAndStore(String key, Collection<String> otherKeys,
  1220. String destKey) {
  1221. return redisTemplate.opsForZSet().intersectAndStore(key, otherKeys,
  1222. destKey);
  1223. }
  1224. /**
  1225. *
  1226. * @param key
  1227. * @param options
  1228. * @return
  1229. */
  1230. public Cursor<TypedTuple<String>> zScan(String key, ScanOptions options) {
  1231. return redisTemplate.opsForZSet().scan(key, options);
  1232. }
  1233. }