redis-springdata-api
使用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的更多相关文章
- php版redis插件,SSDB数据库,增强型的Redis管理api实例
php版redis插件,SSDB数据库,增强型的Redis管理api实例 SSDB是一套基于LevelDB存储引擎的非关系型数据库(NOSQL),可用于取代Redis,更适合海量数据的存储.另外,ro ...
- 基于nginx+lua+redis高性能api应用实践
基于nginx+lua+redis高性能api应用实践 前言 比较传统的服务端程序(PHP.FAST CGI等),大多都是通过每产生一个请求,都会有一个进程与之相对应,请求处理完毕后相关进程自动释放. ...
- python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用
python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用 redispy安装安装及简单使用:https://github.com/andymccurdy/r ...
- Redis多API开发实践
一.Redis API支持 Redis提供了各类开发语言的API,方便开发语言连接使用Redis. https://redis.io/clients 官方网站提供了不同开发语言的API程序. Pyth ...
- redis中文API
1.学习文档地址:http://www.redisdoc.com/en/latest/index.html 2.redis中文API REDIS所有的命令 <<ABOUT LIST> ...
- 【redis】redis实现API接口调用调用次数的限制
redis实现API接口调用调用次数的限制 参考地址:https://bbs.csdn.net/topics/391856106?page=1 参考地址:https://www.cnblogs.com ...
- Redis多API开发
目录 Redis API支持 redis-py安装方式 Python 连接redis 直接连接 使用连接池连接 Windows 连接redis数据库 一.下载Redis Desktop Manager ...
- redis的Linux系统安装与配置、redis的api使用、高级用法之慢查询、pipline事物
今日内容概要 redis 的linux安装和配置 redis 的api使用 高级用法之慢查询 pipline事务 内容详细 1.redis 的linux安装和配置 # redis 版本选择问题 -最新 ...
- 测试Beetle.Redis+Web Api
在Web Api里用Beetle.Redis调用Redis服务端的TIME命令返回一个json格式,然后客户端是用的HttpTest4Net做的测试: CPU:I7-3770 内存:4G+4G 硬盘: ...
- Redis(九):使用RedisTemplate访问Redis数据结构API大全
RedisTemplate介绍 spring封装了RedisTemplate对象来进行对redis的各种操作,它支持所有的 redis 原生的api. RedisTemplate在spring代码中的 ...
随机推荐
- 从0学习JQ
转 张子秋的博客 为以后用到的时候好查询! 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 ...
- linux下怎样用c语言调用shell命令
C程序调用shell脚本共同拥有三种法子 :system().popen().exec系列数call_exec1.c , system() 不用你自己去产生进程.它已经封装了,直接增加自己的命令 ex ...
- Apache服务器的简单配置与安全策略
在之前讲的关于weevely后门分析中,有说到利用Apache的配置文件.htaccess来隐藏php后门.关于.htaccess文件的用途,在此结合Apache服务器的具体配置作一详解,也算是自己的 ...
- hdu 5014 异或序列
http://acm.hdu.edu.cn/showproblem.php?pid=5014 从最大的一个数开始找能配对使他们的异或值最大的一个数 最后输出 #include <cstdio&g ...
- 如何读取maven项目中的resources
建立一个maven web项目,project-name/src/main下面有3个目录,java.resources.webapp java中存放java源代码,package等 resources ...
- elasticsearch geo_point 地理位置过滤 按经度排序
elasticsearch 支持强大的经纬度坐标过滤. 1.首先要建立坐标类型的字段'type' ='geo_point' es存储的值是这样的: "poi": [ ...
- 关于Kafka部署优化的一点建议
网络和IO线程配置优化 配置参数 num.network.threads:Broker处理消息的最大线程数 num.io.threads:Broker处理磁盘IO的线程数 优化建议 一般num.net ...
- [Python]字典Dictionary、列表List、元组Tuple差异化理解
概述:Python中这三种形式的定义相近,易于混淆,应注意区分. aDict={'a':1, 'b':2, 'c':3, 'd':4, 'e':5} aList=[1,2,3,4,5] aTuple= ...
- java的几种定时任务
本篇博文主要是讲述2.x 版本的quartz下的实现方案,1.x 版本的实现方式大致原理一致,但是具体的实现方式有些不一致,具体体现在获取 scheduler 这个类的方式上有些不同,这里不作过多的 ...
- JDK,常见数据结构解读
一.情有独钟 对数据结构情有独钟,打算慢慢把jdk里的实现都读一遍,发现其中的亮点,持续更新. 二.ArrayList 这应该是我们学习java最早接触的到的数据结构,众所周知,数组在申请了内存之后, ...