使用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. Time&Patience

    “时间和耐心,是世间最强大的两个勇士.” “对未来越有信心,对今天越有耐心,坚持做正确的事.” 每日必做清单 每天六组俯卧撑    活在当下    接收脆弱    一万小时理论(罗马不是一天建成的,胖 ...

  2. JSP、Servlet中get请求和post请求的区别总结

    在学习JavaWeb最初的开始阶段,大家都会遇到HttpServlet中的doGet和doPost方法.前两天看<Head First Servlets & JSP>看到其中讲关于 ...

  3. Linux服务器目录空间不足解决措施

      一般情况下工作环境中我们的服务或数据库文件都会存储在一个单独挂载的分区中,一般占空间比较大的大多就是服务的运行日志以及数据库文件,当我们分区的可用空间不足时就需要我们对分区进行扩容,或者找其它方法 ...

  4. hadoop2.6 上hive运行 报“native-lzo library not available”异常处理

    环境:Hadoop 2.6.0  + hive-0.14.0 问题出现的背景:在hive中建表 (建表语句如下),并且表的字段中有Map,Set,Collection等集合类型. CREATE EXT ...

  5. C#DataGridView的简单使用

    首先创建一个DataGridView控件,然后创建列(包括列名的定义), 由于我不是和数据库进行连接,只是为了输出好看一点. 删除所有数据: while (this.dataGridView1.Row ...

  6. DataAnnotations 验证

    转自:http://blog.sina.com.cn/s/blog_c21a857b0102wcus.html 常用的 DataAnnotations 1.Required :属性值必须非空或者不能只 ...

  7. 在Asp.Net MVC中实现上传图片并显示

    实现思路大概分为两步: 1. 通过上传接口,将图片上传到服务器,返回文件路径给客户端: 2. 点击保存上传,将文件路径保存到数据库,如果是多张图片,路径用逗号分隔. 核心上传代码: /// <s ...

  8. [翻译].NET Core 3 Preview1和Windows桌面框架开源

    原文来自TechViews 今天,我们宣布推出.NET Core 3 Preview 1.这是.NET Core 3的第一个公开发布.我们有一些令人兴奋的新功能可供分享,并希望得到您的反馈.您可以使用 ...

  9. .NET Entity Framework (with Oracle ODP.NET)

    一.前言 1.Entity Framework是什么? Entity Framework是微软对ORM框架的实现.类似的实现也有其它方式,如DevExpress 的XPO(eXpress Persis ...

  10. Python 第三方包上传至 PyPI 服务器

    PyPI 服务器主要功能是?PyPI 服务器怎么搭建? PyPI 服务器可以用来管理自己开发的 Python 第三包. Pypi服务器搭建 Python 第三方包在本地打包 # 本地目录执行以下命令应 ...