目录
一、redis的数据类型
二、redis对key的相关操作
1、redis客户端命令行
2、java代码调用
三、Redis字符串类型的操作
1、redis客户端命令行
2、java代码调用
四、Redis列表list类型的操作
1、redis客户端命令行
2、java代码调用
五、Redis的Set类型操作
1、redis客户端命令行
2、java代码调用
六、Redis的SortSet类型操作
1、redis客户端命令行
2、java代码调用
七、Redis的hash类型操作
1、redis客户端命令行
2、java代码调用
redis中有五种数据类型分别是String,list,sort.sort set,hash,下面分别对如下的redis的操作提供两种方式,一种是redis客户端操作,一种是使用java调用redis来进行操作。
作用: 删除1个或多个键
返回值: 不存在的key忽略掉,返回真正删除的key的数量
作用: 给key赋一个新的key名
注:如果newkey已存在,则newkey的原值被覆盖
作用: 把key改名为newkey
返回: 发生修改返回1,未发生修改返回0
注: nx--> not exists, 即, newkey不存在时,作改名动作
将指定的key存放到指定的数据库索引中
(注意: 一个redis进程,打开了不止一个数据库, 默认打开16个数据库,从0到15编号,
如果想打开更多数据库,可以从配置文件修改)
redis 127.0.0.1:6379[1]> select 2
OK
redis 127.0.0.1:6379[2]> keys *
(empty list or set)
redis 127.0.0.1:6379[2]> select 0
OK
redis 127.0.0.1:6379> keys *
1) "name"
2) "cc"
3) "a"
4) "b"
redis 127.0.0.1:6379> move cc 2
(integer) 1
redis 127.0.0.1:6379> select 2
OK
redis 127.0.0.1:6379[2]> keys *
1) "cc"
redis 127.0.0.1:6379[2]> get cc
"3"
在redis里,允许模糊查询key
有3个通配符 *, ? ,[]
*: 通配任意多个字符
?: 通配单个字符
[]: 通配括号内的某1个字符randomkey 返回随机key
redis 127.0.0.1:6379> flushdb
OK
redis 127.0.0.1:6379> keys *
(empty list or set)
redis 127.0.0.1:6379> mset one 1 two 2 three 3 four 4
OK
redis 127.0.0.1:6379> keys o*
1) "one"
redis 127.0.0.1:6379> key *o
(error) ERR unknown command 'key'
redis 127.0.0.1:6379> keys *o
1) "two"
redis 127.0.0.1:6379> keys ???
1) "one"
2) "two"
redis 127.0.0.1:6379> keys on?
1) "one"
redis 127.0.0.1:6379> set ons yes
OK
redis 127.0.0.1:6379> keys on[eaw]
"one"
判断key是否存在,返回1/0
返回key存储的值的类型
有string,link,set,order set, hash
/**
* redis有关key的操作
* RedisTemplate主要支持String,List,Hash,Set,ZSet这几种方式的参数,
* 其对应的方法分别是opsForValue()、opsForList()、opsForHash()、opsForSet()、opsForZSet()。
* 下面分别介绍这几个方法的使用。
*/
@Test
public void testRedisKey(){
//获取操作字符串的操作对象
ValueOperations stringOperations = redisTemplate.opsForValue();
Map person = new HashMap<>(5);
person.put("name","谢奇秀");
person.put("age","23");
person.put("birthday","1994-10-21");
person.put("sex","男");
stringOperations.multiSet(person);
//keys [pattern] 通过通配符获取到匹配的key * 匹配所有字符
// ?匹配单个字符 [char/chaB/char] 匹配括号中的某个字符
Set keys = redisTemplate.keys("*");
log.info("redis中*匹配的所有keys;{}", JsonUtil.gsonString(keys));
keys = redisTemplate.keys("??me");
log.info("redis中的所有keys;{}", JsonUtil.gsonString(keys));
keys = redisTemplate.keys("birthda[xy]");
log.info("redis中的所有keys;{}", JsonUtil.gsonString(keys));
//删除key del key1 [key2 ...]
redisTemplate.delete("name");
List delkeys = new ArrayList<>();
delkeys.add("age");
delkeys.add("sex");
redisTemplate.delete(delkeys);
keys = redisTemplate.keys("*");
log.info("redis中*匹配的所有keys;{}", JsonUtil.gsonString(keys));
//rename oldkey newkey 给key赋予一个新的name 如果新的key存在则原来的key值被覆盖
redisTemplate.rename("name","alias");
//作用: 把key改名为newkey
//返回: 发生修改返回true(说明newkey不存在),不发生修改返回false(说明newkey已经存在)
boolean falg = redisTemplate.renameIfAbsent("name","alias");
if(falg){
log.info("修改成功");
}else{
log.info("修改失败");
}
//move key db 将对应的key存放在 一台redis的服务中默认包含16个库 该行操作将key(默认在0)移动到库索引为2中
//移动没有发生错误 为false 移动发生错误返回true
falg = redisTemplate.move("alias",1);
if(falg){
log.info("没有移动");
}else{
log.info("已经移动");
}
Set keys = redisTemplate.keys("*");
log.info("redis中*匹配的所有keys;{}", JsonUtil.gsonString(keys));
// 获取一个随机的key
String randomKey = (String)redisTemplate.randomKey();
log.info("随机下获取的key:{}",randomKey);
boolean has = redisTemplate.hasKey("name");
if(has){
log.info("存在");
}else{
log.info("不存在");
}
//获取redis中对应的key的类型
DataType type = redisTemplate.type("name");
log.info("redis中对应key的类型为:{}",type.name());
//设置key的生命周期
redisTemplate.expire("age",1000, TimeUnit.MICROSECONDS);
//查询key的生命周期
Long expireTime = redisTemplate.getExpire("age");
log.info("生命周期 -1 表示为持久化 -2表示key不存在 其他的正数为时间单位秒:{}",expireTime);
//将对应的key持久化
boolean isExpirst = redisTemplate.persist("age");
}
如: set a 1 ex 10 , 10秒有效
Set a 1 px 9000 , 9秒有效
注: 如果ex,px同时写,以后面的有效期为准
如 set a 1 ex 100 px 9000, 实际有效期是9000毫秒
nx: 表示key不存在时,执行操作
xx: 表示key存在时,执行操作
例: mset key1 v1 key2 v2 ....
get key
作用:获取key的值
mget key1 key2 ..keyn
作用:获取多个key的值
setrange key offset value
作用:把字符串的offset偏移字节,改成value
redis 127.0.0.1:6379> set greet hello
OK
redis 127.0.0.1:6379> setrange greet 2 x
(integer) 5
redis 127.0.0.1:6379> get greet
"hexlo"
注意: 如果偏移量>字符长度, 该字符自动补0x00
redis 127.0.0.1:6379> setrange greet 6 !
(integer) 7
redis 127.0.0.1:6379> get greet
"heyyo\x00!"
append key value
作用: 把value追加到key的原值上
getrange key start stop
作用: 是获取字符串中 [start, stop]范围的值
注意: 对于字符串的下标,左数从0开始,右数从-1开始
redis 127.0.0.1:6379> set title 'chinese'
OK
redis 127.0.0.1:6379> getrange title 0 3
"chin"
redis 127.0.0.1:6379> getrange title 1 -2
"hines"
注意:
1: start>=length, 则返回空字符串
2: stop>=length,则截取至字符结尾
3: 如果start 所处位置在stop右边, 返回空字符串
getset key newvalue
作用: 获取并返回旧值,设置新值
redis 127.0.0.1:6379> set cnt 0
OK
redis 127.0.0.1:6379> getset cnt 1
"0"
redis 127.0.0.1:6379> getset cnt 2
"1"
incr key
作用: 指定的key的值加1,并返回加1后的值
注意:
1:不存在的key当成0,再incr操作
2: 范围为64有符号
incrby key number
redis 127.0.0.1:6379> incrby age 90
(integer) 92
incrbyfloat key floatnumber
自增根据浮点数
redis 127.0.0.1:6379> incrbyfloat age 3.5
"95.5"
decr key 自减
redis 127.0.0.1:6379> set age 20
OK
redis 127.0.0.1:6379> decr age
(integer) 19
decrby key number
redis 127.0.0.1:6379> decrby age 3
(integer) 16
getbit key offset
作用:获取值的二进制表示,对应位上的值(从左,从0编号)
redis 127.0.0.1:6379> set char A
OK
redis 127.0.0.1:6379> getbit char 1
(integer) 1
redis 127.0.0.1:6379> getbit char 2
(integer) 0
redis 127.0.0.1:6379> getbit char 7
(integer) 1
setbit key offset value
设置offset对应二进制位上的值
返回: 该位上的旧值
注意:
1:如果offset过大,则会在中间填充0,
2: offset最大大到多少
3:offset最大2^32-1,可推出最大的的字符串为512M
bitop operation destkey key1 [key2 ...]
对key1,key2..keyN作operation,(位运算操作)并将结果保存到 destkey 上。
operation 可以是 AND(按位与) 、 OR(按位或) 、 NOT(非) 、 XOR(异或)
注意: 对于NOT操作, key不能多个
redis 127.0.0.1:6379> setbit lower 7 0
(integer) 0
redis 127.0.0.1:6379> setbit lower 2 1
(integer) 0
redis 127.0.0.1:6379> get lower
" "
redis 127.0.0.1:6379> set char Q
OK
redis 127.0.0.1:6379> get char
"Q"
redis 127.0.0.1:6379> bitop or char char lower
(integer) 1
redis 127.0.0.1:6379> get char
"q"
/**
* redis相关的字符串类型的操作
*/
@Test
public void testRedisString(){
//先获取可以操作redis字符串类型的操作对象
ValueOperations stringOperations = redisTemplate.opsForValue();
//设置单个字符串类型的key 默认持久化 且同名key覆盖
stringOperations.set("title","redis字符串操作");
//设置单个字符串类型的key 并设置过期时间 且同名key覆盖
stringOperations.set("name","xieqx",10,TimeUnit.MINUTES);
//设置单个字符串类型的key 持久化 不存在执行才操作,存在则不执行
//第一次插入因为存在 所以返回true
boolean success = stringOperations.setIfAbsent("age","24");
log.info(success+"");
//第二次因为已经存在了 所有返回false
success = stringOperations.setIfAbsent("age","24");
log.info(success+"");
//一次性设置多个值 同名覆盖
Map kvs = new HashMap<>();
kvs.put("file","maven");
kvs.put("length","234");
kvs.put("size","1024");
stringOperations.multiSet(kvs);
//一次性设置多个值 存在则不进行设置
boolean isSuccess = stringOperations.multiSetIfAbsent(kvs);
log.info(""+ isSuccess);
//获取其中单个key的值
String value = (String)stringOperations.get("name");
log.info("value: {}",value);
//获取多个key的值
List keys = new ArrayList<>();
keys.add("name");
keys.add("size");
keys.add("age");
List values = stringOperations.multiGet(keys);
log.info("values :{}",JsonUtil.gsonString(values));
//设置对应key的字符串的偏移量改为value 如果偏移量>字符长度 该字符自动补全以0x00 没有实现
// 获取对应的key中指定范围的值 没有实现
stringOperations.append("name"," xiu");
String name = (String)stringOperations.get("name");
log.info("name: {}",value);
//获取旧值设置新值
String oldName = (String)stringOperations.getAndSet("name","shizb");
log.info("oldName :{}"+oldName);
stringOperations.set("age","24");
//自增 整数类型 自减 数值为负数
stringOperations.increment("age",-22);
//Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException:
// ERR value is not an integer or out of range
//stringOperations.increment("name",2);
//自增 浮点数类型(会有精度损失) 自减 数值为负浮点数
stringOperations.increment("size",2.3);
//操作值得二进制表示
//示范例子 将A 转换为a A 的ASCII 为65 a的ASCII 为97 两者相差 32 即为二进制上的第六位的值不同
//A的第六位为0 a的第二位为1 在redis操作值的二进制位上
stringOperations.set("charcter","A");
stringOperations.setBit("charcter",2,true);
String value = stringOperations.get("charcter");
log.info("charcter :{}",value);
//获取key的二进制值
boolean bit = stringOperations.getBit("charcter",3);
if(bit){
log.info("charcter 下的第二位的值:{}",1);
}
else{
log.info("charcter 下的第二位的值:{}",0);
}
}
作用: 把值插入到链接头部
作用: 返回并删除链表尾元素
rpush,lpop: 不解释
作用: 返回链表中[start ,stop]中的元素
规律: 左数从0开始,右数从-1开始
作用: 从key链表中删除 value值
注: 删除count的绝对值个value后结束
Count>0 从表头删除
Count<0 从表尾删除
作用: 剪切key对应的链接,切[start,stop]一段,并把该段重新赋给key
作用: 返回index索引上的值,
如 lindex key 2
作用:计算链接表的元素个数
redis 127.0.0.1:6379> llen task
(integer) 3
redis 127.0.0.1:6379>
作用: 在key链表中寻找’search’,并在search值之前|之后,.插入value
注: 一旦找到一个search后,命令就结束了,因此不会插入多个value
rpoplpush source dest
作用: 把source的尾部拿出,放在dest的头部,
并返回 该单元值
场景: task + bak 双链表完成安全队列
Task列表 bak列表
|
|
|
|
|
|
业务逻辑:
1:Rpoplpush task bak
2:接收返回值,并做业务处理
3:如果成功,rpop bak 清除任务. 如不成功,下次从bak表里取任务
brpop ,blpop key timeout
作用:等待弹出key的尾/头元素,
Timeout为等待超时时间
如果timeout为0,则一直等待
场景: 长轮询Ajax,在线聊天时,能够用到
/**
* redis相关的list列表操作
*/
@Test
public void testRedisList() {
//获取操作list的对象
ListOperations listOperations = redisTemplate.opsForList();
String key = "names";
//从左边插入值到列表中(即插入到列表的头部)
listOperations.leftPush(key,"zhangsan");
//leftPush(key,privot,value)往names中插入key,插入的位置在privot的前面,如果privot不存在,则不会插入
//在key链表中寻找’search’,并在search值之前(left)|之后(right),.插入value
listOperations.leftPush(key,"zhangsan","wangwu");
//一次性插入多个数据
listOperations.leftPushAll(key,"xieqx","qixx","shzb","liangzj");
//只有存在key对应的列表才能将这个value值插入到key所对应的列表中
listOperations.rightPushIfPresent(key,"xieqx");
//获取列表中的集合的大小
Long end = listOperations.size("names");
//获取列表中指定范围中的数据 返回一个list集合
List list = listOperations.range("names",0,end);
log.info("names list:{}",JsonUtil.gsonString(list));
//从头部获取并移除列表中的一个元素
String first = listOperations.leftPop(key);
log.info("names list first:{}",first);
//Blpop 从头部获取数据,没有则一直阻塞,直到超时(或者在超时之前获取到该值)
first = listOperations.leftPop(key,1,TimeUnit.MINUTES);
log.info("names list first:{}",first);
end = listOperations.size("names");
list = listOperations.range("names",0,end);
log.info("names list:{}",JsonUtil.gsonString(list));
//listOperations.rightPush() rightPushALl rightPushIfPresent 与上边操作的相似,只是一个从左边(头部),一个是从右边(尾部)
//从列表中删除count绝对值个value(count为负数则从尾部删除,count整数则从头部删除,返回真是删除的值的个数)
long realRemLen = listOperations.remove(key,2,"szb");
log.info("删除了 {}",realRemLen);
// 剪切key对应的链接,切[start,stop]一段,并把该段重新赋给key
listOperations.trim(key,0, 2);
end = listOperations.size("names");
list = listOperations.range("names",0,end);
log.info("names list:{}",JsonUtil.gsonString(list));
//lindex key index
//作用: 返回index索引上的值,
String value = listOperations.index(key,2);
log.info("names list:index下的值{}",value);
}
集合的性质: 唯一性,无序性,确定性
注: 在string和link的命令中,可以通过range 来访问string中的某几个字符或某几个元素
但,因为集合的无序性,无法通过下标或范围来访问部分元素.
因此想看元素,要么随机先一个,要么全选
作用: 往集合key中增加元素
作用: 删除集合中集为 value1 value2的元素
返回值: 忽略不存在的元素后,真正删除掉的元素的个数
作用: 返回并删除集合中key中1个随机元素
随机--体现了无序性
作用: 返回集合key中,随机的1个元素.
作用: 判断value是否在key集合中
是返回1,否返回0
作用: 返回集中中所有的元素
作用: 返回集合中元素的个数
作用:把source中的value删除,并添加到dest集合中
作用: 求出key1 key2 key3 三个集合中的交集,并返回
redis 127.0.0.1:6379> sadd s1 0 2 4 6
(integer) 4
redis 127.0.0.1:6379> sadd s2 1 2 3 4
(integer) 4
redis 127.0.0.1:6379> sadd s3 4 8 9 12
(integer) 4
redis 127.0.0.1:6379> sinter s1 s2 s3
1) "4"
redis 127.0.0.1:6379> sinter s3 s1 s2
"4"
作用: 求出key1 key2 key3 三个集合中的交集,并赋给dest
作用: 求出key1 key2 keyn的并集,并返回
作用: 求出key1与key2 key3的差集
即key1-key2-key3
/**
* redis相关的set操作
*/
@Test
public void testRedisSet() {
//获取set相关的操作对象
SetOperations setOperations = redisTemplate.opsForSet();
String key = "sores";
//添加元素
setOperations.add(key,"12","15","9","13","13");
//获取元素 ,要么获取所有,要么获取随机的一个,因为set无序
//获取key下的所有
Set sets = setOperations.members(key);
log.info("set 列表:{}",JsonUtil.gsonString(sets));
String randomValue = setOperations.randomMember(key);
log.info("randomValue :{}",randomValue);
List list = setOperations.randomMembers(key,2);
log.info("随机获取指定个数的集合数据:{}",JsonUtil.gsonString(list));
//获取多个key无序集合中的元素(去重),count表示个数
sets = setOperations.distinctRandomMembers(key,5);
log.info("set 列表:{}",JsonUtil.gsonString(sets));
//随机移除一个元素
String aloenRem = setOperations.pop(key);
log.info("移除一个元素:{}",aloenRem);
//随机移除若干个元素
List removes = setOperations.pop(key,2);
log.info("移除若干个元素:{}",aloenRem);
//根据值移除元素 ,值可以为一个或者多个 返回是指删除的元素个数
long realRemve = setOperations.remove(key,"13","9");
log.info("real remove element size is :{}",aloenRem);
//判断元素是否在集合中
boolean falg = setOperations.isMember(key,"12");
log.info("the value is exist :{}",falg);
//返回集合中元素的个数
log.info("the set size is :{}",setOperations.size(key));
//把source中的value删除,并添加到dest集合中
boolean success = setOperations.move(key,"9","outofDate");
log.info("mcve is success :{}",success);
sets = setOperations.members("outofDate");
log.info("set 列表:{}",JsonUtil.gsonString(sets));
//获取集合中并集,交集,差集
setOperations.add("A","12","15","9","13","13");
setOperations.add("B","1","15","4","13","6");
//获取其中的交集并返回
sets = setOperations.intersect("A","B");
log.info("集合之间的交集 列表:{}",JsonUtil.gsonString(sets));
//获取其中的交集并存在另一个key中
setOperations.intersectAndStore("A","B","C");
sets = setOperations.members("C");
log.info("集合之间的交集(存储) 列表:{}",JsonUtil.gsonString(sets));
//获取集合中的交集
setOperations.union("A","B");
log.info("集合之间的并集 列表:{}",JsonUtil.gsonString(sets));
setOperations.unionAndStore("A","B","C");
sets = setOperations.members("C");
log.info("集合之间的并集(存储) 列表:{}",JsonUtil.gsonString(sets));
//获取集合中的差集
setOperations.difference("A","B");
log.info("集合之间的差集 列表:{}",JsonUtil.gsonString(sets));
setOperations.differenceAndStore("A","B","C");
sets = setOperations.members("C");
log.info("集合之间的差集(存储) 列表:{}",JsonUtil.gsonString(sets));
}
添加元素
redis 127.0.0.1:6379> zadd stu 18 lily 19 hmm 20 lilei 21 lilei
(integer) 3
作用: 删除集合中的元素
作用: 按照socre来删除元素,删除score在[min,max]之间的
redis 127.0.0.1:6379> zremrangebyscore stu 4 10
(integer) 2
redis 127.0.0.1:6379> zrange stu 0 -1
1) "f"
作用: 按排名删除元素,删除名次在[start,end]之间的
redis 127.0.0.1:6379> zremrangebyrank stu 0 1
(integer) 2
redis 127.0.0.1:6379> zrange stu 0 -1
1) "c"
2) "e"
3) "f"
4) "g"
查询member的排名(升续 0名开始)
查询 member的排名(降续 0名开始)
把集合排序后,返回名次[start,stop]的元素
默认是升续排列
Withscores 是把score也打印出来
作用:把集合降序排列,取名字[start,stop]之间的元素
作用: 集合(升续)排序后,取score在[min,max]内的元素,
并跳过 offset个, 取出N个
redis 127.0.0.1:6379> zadd stu 1 a 3 b 4 c 9 e 12 f 15 g
(integer) 6
redis 127.0.0.1:6379> zrangebyscore stu 3 12 limit 1 2 withscores
1) "c"
2) "4"
3) "e"
4) "9"
返回元素个数
zcount key min max
返回[min,max] 区间内元素的数量
[WEIGHTS weight [weight ...]]
[AGGREGATE SUM|MIN|MAX]
求key1,key2的交集,key1,key2的权重分别是 weight1,weight2
聚合方法用: sum |min|max
聚合的结果,保存在dest集合内
注意: weights ,aggregate如何理解?
答: 如果有交集, 交集元素又有socre,score怎么处理?
Aggregate sum->score相加 , min 求最小score, max 最大score
另: 可以通过weigth设置不同key的权重, 交集时,socre * weights
详见下例
redis 127.0.0.1:6379> zadd z1 2 a 3 b 4 c
(integer) 3
redis 127.0.0.1:6379> zadd z2 2.5 a 1 b 8 d
(integer) 3
redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2
(integer) 2
redis 127.0.0.1:6379> zrange tmp 0 -1
1) "b"
2) "a"
redis 127.0.0.1:6379> zrange tmp 0 -1 withscores
1) "b"
2) "4"
3) "a"
4) "4.5"
redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2 aggregate sum
(integer) 2
redis 127.0.0.1:6379> zrange tmp 0 -1 withscores
1) "b"
2) "4"
3) "a"
4) "4.5"
redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2 aggregate min
(integer) 2
redis 127.0.0.1:6379> zrange tmp 0 -1 withscores
1) "b"
2) "1"
3) "a"
4) "2"
redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2 weights 1 2
(integer) 2
redis 127.0.0.1:6379> zrange tmp 0 -1 withscores
1) "b"
2) "5"
3) "a"
4) "7"
/**
* redis相关的Sort set操作
*/
@Test
public void testRedisSortSet() {
//获取操作SortSet 操作对象
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
String key = "names";
//添加元素
//单个元素添加
zSetOperations.add(key,"xieqx",10);
//添加多个
Set> set = new HashSet<>();
DefaultTypedTuple element = new DefaultTypedTuple("szb",9.3);
DefaultTypedTuple elementA = new DefaultTypedTuple("lzj",9.0);
DefaultTypedTuple elementB = new DefaultTypedTuple("qxx",8.9);
set.add(element);
set.add(elementA);
set.add(elementB);
zSetOperations.add(key,set);
//获取单个值。获取所有值
//获取 start 到end范围的数据
Set sets = zSetOperations.range(key,0,2);
log.info("根据范围获取的值:{}",JsonUtil.gsonString(sets));
/*
out(vo.rangeByLex("book", Range.range().lte("f").gte("b")));
out(vo.rangeByLex("book", Range.range(), Limit.limit().count(2).offset(0)));
out(vo.rangeByLex("book", Range.range(), Limit.limit().count(2).offset(2)));
*/
//根据值去筛选数据
//获取小于等于“value1”大于等于“value2”
sets = zSetOperations.rangeByLex(key, RedisZSetCommands.Range.range().lte("xieqx").gte("lzj"));
log.info("根据范围Rangge获取的值:{}",JsonUtil.gsonString(sets));
//从key中获取从0(偏移量)数量为2的数据信息
sets = zSetOperations.rangeByLex(key, RedisZSetCommands.Range.range(), RedisZSetCommands.Limit.limit().count(2).offset(0));
log.info("根据范围Rangge获取的值:{}",JsonUtil.gsonString(sets));
//根据得分筛选数据
sets = zSetOperations.rangeByScore(key,1,950);
log.info("根据分数范围获取的值:{}",JsonUtil.gsonString(sets));
sets = zSetOperations.rangeByScore(key,9.0,9.5,1,2);
log.info("根据分数范围获取的值:{}",JsonUtil.gsonString(sets));
//根据得分筛选数据 并将分数也会封装在TypedTuple
Set> typeSet = zSetOperations.rangeByScoreWithScores(key,9.0,9.5,0,3);
for(ZSetOperations.TypedTuple typedTuple:typeSet){
log.info("获取的信息:score {},value {}",typedTuple.getScore(),typedTuple.getValue());
}
//返回元素的个数
long count = zSetOperations.count(key,0,10);
log.info("所有元素的个数:{}",count);
String key2 = "names2";
//添加元素
//单个元素添加
zSetOperations.add(key2,"xieqx",4);
//添加多个
Set> set2 = new HashSet<>();
DefaultTypedTuple element2 = new DefaultTypedTuple("szb",3D);
DefaultTypedTuple element2A = new DefaultTypedTuple("lzj",1D);
DefaultTypedTuple element2B = new DefaultTypedTuple("qxx",1D);
set2.add(element);
set2.add(elementA);
set2.add(elementB);
zSetOperations.add(key2,set2);
zSetOperations.intersectAndStore(key,key,"desc");
sets = zSetOperations.rangeByScore("desc",0,10);
log.info("根据分数范围获取的值:{}",JsonUtil.gsonString(sets));
}
作用: 把key中 filed域的值设为value
注:如果没有field域,直接添加,如果有,则覆盖原field域的值
作用: 设置field1->N 个域, 对应的值是value1->N
作用: 返回key中field1 field2 fieldN域的值
作用:返回key中,所有域与其值
作用: 删除key中 field域
作用: 返回key中元素的数量
作用: 判断key中有没有field域
作用: 是把key中的field域的值增长整型值value
作用: 是把key中的field域的值增长浮点值value
作用: 返回key中所有的field
作用: 返回key中所有的value
/**
* redis相关的Hash操作
*/
@Test
public void testRedisHash() {
//获取操作hash的对象
HashOperations hashOperations = redisTemplate.opsForHash();
String key = "hash";
//存放单个hash 如果key不存在则存储,否则不存储
hashOperations.putIfAbsent(key,"1","xieqx");
hashOperations.putIfAbsent(key,"2","qixx");
hashOperations.put(key,"3","szb");
Map data = new HashMap<>();
data.put("4","aaa");
data.put("5","bbb");
data.put("6","ccc");
hashOperations.putAll(key,data);
//获取单个数据
String value = hashOperations.get(key,"1");
log.info("value:{}",value);
Map hashData = hashOperations.entries(key);
log.info("hashData : {}",JsonUtil.gsonString(hashData));
//删除 真实删除的数据
long deleNum = hashOperations.delete(key,"1","2","3");
//获取hash数据的长度
long len = hashOperations.size(key);
log.info("hash 数据长度:{}",len);
//判断hashKey是否存在
boolean hasKey = hashOperations.hasKey(key,"123");
log.info("查看hashkey是否存在:{}",hasKey);
hashOperations.put(key,"num","123");
hashOperations.increment(key,"num",5);
String num = hashOperations.get(key,"num");
log.info("num:{}",num);
//获取所有的keys
Set sets = hashOperations.keys(key);
log.info("获取hash中所有的key:{}",JsonUtil.gsonString(key));
//获取所有的values
List values = hashOperations.values(key);
log.info("获取hash中所有的key:{}",JsonUtil.gsonString(values));
}