使用StringRedisTempalte操作redis五种数据类型

spring-data中继承了redisTemplate, 提供redis非切片连接池

代码github地址: https://github.com/wenbronk/redis-java.git

package com.iwhere.learn.reids.spring;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.BoundListOperations;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.BoundValueOperations;
import org.springframework.data.redis.core.BoundZSetOperations;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations.TypedTuple;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /**
* 使用spring 整合redis 操作 redisTemplate 通过bound 对 key进行了绑定操作, 绑定后再次操作无需声明key的值,
* 直接操作value即可 opsForValue 和 boundValueOps类似, 只是没有绑定key
*
* 但遗憾的是, 对redisSharding的支持并不是太好
*
* @author wenbronk
* @time 2017年3月24日 下午1:29:21 2017
*/ @RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class RedisTestSpring { @Autowired
private StringRedisTemplate redisTemplate; /**
* 测试 对key的操作
*/
@Test
public void testkey() {
String key = "user";
// 删除key
redisTemplate.delete(key);
redisTemplate.expire(key, , TimeUnit.HOURS);
  }
          
    /**判断key是否存在
* @param key
* @return
*/
public boolean exists(final String key) {
return redisTemplate.execute(new RedisCallback() {
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
return connection.exists(key.getBytes());
}
});
}
/**
* String 类型的value
*/
@Test
public void testBoundValueOps() {
String key = "user";
BoundValueOperations<String, String> valueOps = redisTemplate.boundValueOps(key); // 获取key的名字
String key2 = valueOps.getKey(); // 获取类型
DataType type = valueOps.getType(); valueOps.set("vini");
// 不存在添加, 存在返回false
Boolean setIfAbsent = valueOps.setIfAbsent(""); String get = valueOps.get();
valueOps.append("wenbronk");
// 获取并set
String andSet = valueOps.getAndSet("wenbronk"); // 获取角标字符
String getIndex = valueOps.get(, );
// 在角标添加
valueOps.set("", ); // 添加并设置过期时间
valueOps.set("", , TimeUnit.SECONDS);
} /**
* list 类型的操作
*/
@Test
public void testBoundListOps() {
String key = "testList";
BoundListOperations<String, String> listOps = redisTemplate.boundListOps(key); // 获取key的名字
String key2 = listOps.getKey(); // 获取类型
DataType type = listOps.getType(); // 左侧先出栈, 正常pop
listOps.leftPush("cs01", "cs03"); // 在cs03的左侧插入
listOps.leftPushAll("cs0001", "cs002"); // 批量插入
listOps.leftPushIfPresent("cs02"); // 右侧入栈
listOps.rightPush("cs01", "cs03");
listOps.rightPushAll("cs0001", "cs002");
listOps.rightPushIfPresent("cs02"); // 出栈
String leftPop = listOps.leftPop();
String rightPop = listOps.rightPop(); // 根据角标获取
String index = listOps.index();
List<String> range = listOps.range(, -);
// 替换角标为2 的数据
listOps.set(, "abc"); // 删除过期, 如果有的话
Boolean boolean1 = listOps.persist();
} /**
* 测试set操作
*/
@Test
public void testSetOps() {
BoundSetOperations<String, String> setOps = redisTemplate.boundSetOps("testSet"); // 获取key的名字
String key2 = setOps.getKey(); // 获取类型
DataType type = setOps.getType(); // 添加, 可添加多个, 可变参
setOps.add("aa", "bcb", "ccc"); // 获取, 顺序可能不一致
Set<String> members = setOps.members();
// 随机获取一个
String randomMember = setOps.randomMember();
// 随机获取两个, 值可能一样
List<String> randomMembers = setOps.randomMembers();
// 获取两个不一样的随机数
Set<String> distinctRandomMembers = setOps.distinctRandomMembers(); // 是否包含
Boolean member = setOps.isMember("aa"); // 长度
Long size = setOps.size(); // 集合运算
// 交集, 数据类型一致
Set<String> intersect = setOps.intersect("setTest1");
// 并集
Set<String> union = setOps.union("setTest2");
// 差集
Set<String> diff = setOps.diff("setTest2"); // 获取集合后, 存在另一个set里面
setOps.unionAndStore("setTest2", "unionSet");
} /**
* 测试zset操作, 有序集合
*/
@Test
public void testZSetOps() {
BoundZSetOperations<String, String> zsetOps = redisTemplate.boundZSetOps("testZSet"); // 添加, 并给一个初始分数
zsetOps.add("abc", ); // 获取分数
Double score = zsetOps.score("abc");
// 统计分数段内的个数
zsetOps.count(, );
// 修改一条记录的分数
zsetOps.incrementScore("abc", );
// 分数段内的元素
Set<String> rangeByScore = zsetOps.rangeByScore(, ); // 集合运算
// 交集存储到testZSET3 里面
zsetOps.intersectAndStore("testZSET2", "testZSET3");
// 并集
zsetOps.unionAndStore("testZSET2", "testZSET4"); // 角标操作, 正序获取
Set<String> range = zsetOps.range(, -);
// 倒序获取
Set<String> reverseRange = zsetOps.reverseRange(, -);
// 根据分数获取
Set<TypedTuple<String>> rangeWithScores = zsetOps.rangeWithScores(, ); // 删除元素
zsetOps.remove("abc");
// 删除分数段内的元素
zsetOps.removeRangeByScore(, );
// 删除指定区间的元素
zsetOps.removeRange(, );
} /**
* 测试hash结构的
*/
@Test
public void testHash() {
BoundHashOperations<String, String, String> ops = redisTemplate.boundHashOps("testHash");
//存入, 可一次存入多条
ops.put("cs01", "");
ops.putIfAbsent("cs02", ""); // tableName的名字
String key1 = ops.getKey();
DataType type = ops.getType(); // 获取key值
String key11 = ops.get("cs01"); // 获取所有的key-value值
Map<String, String> maps = ops.entries(); // ops.persist();//删除过期(如果有的话)的数据。
ops.getExpire();
// 设置生存时间
ops.expireAt(new Date());// true // 检查元素是否存在
ops.hasKey("cs01");// true Set<String> keys = ops.keys();// 获取所有的key System.out.println("ops.values():" + ops.values());// 获取所有的value System.out.println("ops.size():" + ops.size());// 2 获取数量 ops.delete("cs01");// 删除key为cs01的数据
} /**
* opsForXXX 只是没有绑定key名, 其他操作都一样
* @param tableName
*/
@Test
public void opsForHash(String tableName) {
System.out.println("==================Hash==============");
HashOperations<String, Object, Object> ops = redisTemplate.opsForHash();
ops.put(tableName, "cs01", "");// 存入数据 ops.putAll(maps); 存入多条数据
Object key11 = ops.get(tableName, "cs01");
System.out.println("key11:" + key11);// 获取key的值 ops.putIfAbsent(tableName, "cs02", "");
Object key21 = ops.get(tableName, "cs02");
System.out.println("ops.get(cs02)-key21:" + key21); Map<Object, Object> maps = ops.entries(tableName);// 获取所有的key-value值
for (Object key : maps.keySet()) {
System.out.println("map-key:" + key + "map-value:" + maps.get(key));
}
// ops.persist();//删除过期(如果有的话)的数据。
System.out.println("ops.hasKey(cs01):" + ops.hasKey(tableName, "cs01"));// true
System.out.println("ops.hasKey(cs02):" + ops.hasKey(tableName, "cs02"));// true
System.out.println("ops.size():" + ops.size(tableName));// Set<Object> keys = ops.keys(tableName);// 获取所有的key
for (Object string : keys) {
System.out.println("ops.keys():" + string);
} System.out.println("ops.values():" + ops.values(tableName));// 获取所有的value
System.out.println("ops.size():" + ops.size(tableName));// 2 获取数量 ops.delete("cs01");// 删除key为cs01的

redis-springdata-api的更多相关文章

  1. php版redis插件,SSDB数据库,增强型的Redis管理api实例

    php版redis插件,SSDB数据库,增强型的Redis管理api实例 SSDB是一套基于LevelDB存储引擎的非关系型数据库(NOSQL),可用于取代Redis,更适合海量数据的存储.另外,ro ...

  2. 基于nginx+lua+redis高性能api应用实践

    基于nginx+lua+redis高性能api应用实践 前言 比较传统的服务端程序(PHP.FAST CGI等),大多都是通过每产生一个请求,都会有一个进程与之相对应,请求处理完毕后相关进程自动释放. ...

  3. python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用

    python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用 redispy安装安装及简单使用:https://github.com/andymccurdy/r ...

  4. Redis多API开发实践

    一.Redis API支持 Redis提供了各类开发语言的API,方便开发语言连接使用Redis. https://redis.io/clients 官方网站提供了不同开发语言的API程序. Pyth ...

  5. redis中文API

    1.学习文档地址:http://www.redisdoc.com/en/latest/index.html 2.redis中文API REDIS所有的命令 <<ABOUT LIST> ...

  6. 【redis】redis实现API接口调用调用次数的限制

    redis实现API接口调用调用次数的限制 参考地址:https://bbs.csdn.net/topics/391856106?page=1 参考地址:https://www.cnblogs.com ...

  7. Redis多API开发

    目录 Redis API支持 redis-py安装方式 Python 连接redis 直接连接 使用连接池连接 Windows 连接redis数据库 一.下载Redis Desktop Manager ...

  8. redis的Linux系统安装与配置、redis的api使用、高级用法之慢查询、pipline事物

    今日内容概要 redis 的linux安装和配置 redis 的api使用 高级用法之慢查询 pipline事务 内容详细 1.redis 的linux安装和配置 # redis 版本选择问题 -最新 ...

  9. 测试Beetle.Redis+Web Api

    在Web Api里用Beetle.Redis调用Redis服务端的TIME命令返回一个json格式,然后客户端是用的HttpTest4Net做的测试: CPU:I7-3770 内存:4G+4G 硬盘: ...

  10. Redis(九):使用RedisTemplate访问Redis数据结构API大全

    RedisTemplate介绍 spring封装了RedisTemplate对象来进行对redis的各种操作,它支持所有的 redis 原生的api. RedisTemplate在spring代码中的 ...

随机推荐

  1. Hdu4632 Palindrome subsequence 2017-01-16 11:14 51人阅读 评论(0) 收藏

    Palindrome subsequence Problem Description In mathematics, a subsequence is a sequence that can be d ...

  2. Android学习整理之Activity篇

    一.Activity概念介绍 activity属于android的四大组件之一(其他的三个: Content provider,Broadcast receiver,Service),它可以理解为一个 ...

  3. 使用Linq对Hashtable和Dictionary<T,T>查询的效率比较

    近期做版本迭代任务,有一个在店铺头部展示店主所在的城市名称和省份名称的需求,店主信息表中保存了店主所在的城市Id和省份Id,由于原有业务复杂,要尽量减少Sql执行时间,所以不考虑join城市地区详细表 ...

  4. JavaScript中使用function作为对象键值

    JavaScript的键值只能是string或者number,这一点真是返祖现象啊.现在我面临的问题: var funcs = {}; var funcA = function() { }; var ...

  5. c# HashSet 列表去重

    List<, , , }; HashSet<int> hs = new HashSet<int>(list); List<, , , }; HashSet<i ...

  6. ASP.NET Core使用EF Core操作MySql数据库

    ASP.NET Core操作MySql数据库, 这样整套环境都可以布署在Linux上 使用微软的 Microsoft.EntityFrameworkCore(2.1.4) 和MySql出的 MySql ...

  7. wpf控件拖动

    Thumb 拖动 上代码! <Window x:Class="Thumb控件移动.MainWindow" xmlns="http://schemas.microso ...

  8. HEOI2014 南国满地堆轻絮

    题目链接:戳我 就是二分一个数,之后记录一个前缀max,然后和当前数做差再/2即可.(因为我们要使得原来的序列变成不下降序列,所以当然是要控制一个上限,以达到后面较小数能以尽可能小的代价增加) 代码如 ...

  9. APP间传递消息

    https://www.jianshu.com/p/d640ccfcea5f 1: URL Scheme 常用的App间传值方式.常见于分享等. 2: Keychain  借助系统类 Keychain ...

  10. Django + DRF + Elasticsearch 实现搜索功能

    django使用haystack来调用Elasticsearch搜索引擎  如何使用django来调用Elasticsearch实现全文的搜索 Haystack为Django提供了模块化的搜索.它的特 ...