使用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. hdu 5024 最长的L型

    http://acm.hdu.edu.cn/showproblem.php?pid=5024 找到一个最长的L型,L可以是斜着的 简单的模拟 #include <cstdio> #incl ...

  2. 结对编程-四则运算生成器(java实现)

     结对伙伴:陈振华  项目要求 1.题目:实现一个自动生成小学四则运算题目的命令行程序. 2.需求: 1. 使用 -n 参数控制生成题目的个数 2. 使用 -r 参数控制题目中数值(自然数.真分数和真 ...

  3. delphi执行一个外部程序,当外部程序结束后,delphi程序立即响应

    //需要引用 ShellAPI 单元;procedure TForm1.Button1Click(Sender: TObject); var SEInfo: TShellExecuteInfo; Ex ...

  4. IE下 input 的父级标签被 disabled 之后引发的怪异行为

    前段时间做了个网盘类的项目,意外发现了这个情况 IE下,将input的父级标签增加 disabled 属性之后,input 的行为变得怪异: 1.input 背景变灰,疑似也被disabled 了. ...

  5. Emmet常用语法

    Emmet常用语法1.输入!和html:5(不能大写),按下TAB 键,快速生成一个 HTML5 的标准文档初始结构. html:xt 生成 HTML4 过渡型 html:4s 生成 HTML4 严格 ...

  6. linux系统编程之文件与IO(五):stat()系统调用获取文件信息

    一.stat()获取文件元数据 stat系统调用原型: #include <sys/stat.h> int stat(const char *path, struct stat *buf) ...

  7. 设计模式之工厂模式(Factory Pattern)

    一.什么是工厂模式? 1.“简单工厂模式”,Simple Factory Pattern 也就是常用的在Factory类中定义静态方法负责new对象的方式. 摘要中提到过“严格地说,这种被称为“简单工 ...

  8. JAVA 从头开始<一>

    一.前言 之前用的是C#,公司最近听说要做的新项目是用JAVA的,所以就学一下JAVA是怎么使的,顺便记录一下. 二.软件的安装 1.下载 我系统是WIN10 x64的 下载完成 2.安装 ①习惯性 ...

  9. Lucene.net 全文检索数据库

    #define Search using Lucene.Net.Analysis; using Lucene.Net.Analysis.Tokenattributes; using Lucene.Ne ...

  10. RxJS入门之函数响应式编程

    一.函数式编程 1.声明式(Declarativ) 和声明式相对应的编程⽅式叫做命令式编程(ImperativeProgramming),命令式编程也是最常见的⼀种编程⽅式. //命令式编程: fun ...