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代码中的 ...
随机推荐
- 用VS2010编译python2.7的源码
1.下载python2.7的源码,解压缩如下目录 2. 网上有些教程说从PCbuild目录中进入,打开sln文件,但是我这样做是不能用vs2010打开的, 并且也尝试了用VS2013打开sln,但是是 ...
- SyntaxError: Non-ASCII character '\xe5' in file test.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
python的默认编码文件是用的ASCII码,而你的python文件中使用了中文等非英语字符. 在Python源文件的最开始一行,加入一句: # coding=UTF-8
- cxgrid动态显示行号
uses cxLookAndFeelPainters; type TMyCxGrid = class(TObject) class procedure DrawIndicatorCell( ...
- 学习总结---INNODB 事务并发
目前在做一个OLTP的数据库系统,批量读写和随机读写并发,情况比较复杂.INNODB是我们的MYSQL引擎,他的主要特点是读操作可以不受阻塞,而修改操作会加锁.如何才能最高效的使用innodb是我们需 ...
- AspNetCore Mvc 自定义中间件认证
AspNetCore Mvc 自定义中间件认证 实现控制器访问验证和拦截. 1.注册政策. 例如: services.AddAuthorization(options => { options. ...
- SQL Server 错误:924 解决方法
USE master; GO DECLARE @SQL VARCHAR(MAX); SET @SQL='' SELECT @SQL=@SQL+'; KILL '+RTRIM(SPID) FROM ma ...
- ACTGame项目
项目地址:https://github.com/alonecat06/ACTGame游戏地址:http://pan.baidu.com/s/1hqD3IYw 项目是一个自制单机动作游戏demo,方向是 ...
- RabbitMQ之消息持久化(转)
原文地址 https://blog.csdn.net/u013256816/article/details/60875666/ 消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证 ...
- Android UI/UX 工具
Zeplin 用于界面图片自动导出. 图标 : https://material.io/icons/
- S11 day 94 RestFramework 之 APIView视图
VIEW视图(Django自带的) 1. url url(r'login/$', views.login.as_view()), 2.点开 as_view() , as_view()为类方法. l ...