RedisTemplate操作redis数据库

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/xinyuezitang/article/details/99626348

一 RedisTemplate

1 redis

Redis是一种非关系型数据库, 可以存取数据.
一般用作缓存数据库, 可以减少正常数据库的压力.

2 redis可以存储的5种数据结构

redis可以存储5种数据结构 : 字符串, 列表, 集合, 有序集合, 散列

3 Spring封装了RedisTemplate对象来进行对Redis的各种操作.
RedisTemplate位于spring-data-redis包下。

redisTemplate操作5种数据结构:

方法一: 
	字符串:   redisTemplate.opsForVaule().  
	列表:     redisTemplate.opsForList().
	集合:     redisTemplate.opsForSet().
	有序集合:  redisTemplate.opsForZset().
	哈希:     redisTemplate.opsForHash().


方法二: 
	字符串:   redisTemplate.boundValueOps(key).
	列表:     redisTemplate.boundListOps(key).
	集合:     redisTemplate.boundSetOps(key).
	有序集合:  redisTemplate.boundZsetOps(key).
	哈希:     redisTemplate.boundHashOps(key).


两者区别:
	前者没有指定key,  可以操作多个key 进行存值取值
	后者有指定的key, 只能操作该key对应的value

4 RedisTemolate操作redis数据库

(1)String数据结构

方法一:

//存值
redisTemplate.opsForValue().set("key","zhangsan");
//取值
String name = (String) redisTemplate.opsForValue().getString("key");
//删除
redisTemplate.opsForValue().delete("key");

//设置过期时间
语法: set void set(K key, V value, long timeout, TimeUnit unit); 
redisTemplate.opsForValue().set("key","zhangsan",3600,TimeUnit.SECONDS ); 

//从偏移位开始重写value值
语法: set void set(K key, V value, long offset);
redisTemplate.opsForValue("key","liu",5);  
结果:  getString("key") => zhangliu

//获取长度
redisTemplate.opsForValue.size("key");

方法二:

//存值
redisTemplate.boundValueOps("name").set("张三");
//取值
String name = (String)redisTemplate.boundVauleOps("name").get();
//删除
redisTemplate.delete("name");

(2) List数据结构
list类型分两种, 一种是左压栈, 一种是右压栈

方法一:

//存值
A 右压栈
redisTemplate.opsForList().rightPush("nameList","zhangsan");
redisTemplate.opsForList().rightPush("nameList","lisi");
redisTemplate.opsForList().rightPush("nameList","wangwu");
结果: ["zhangsan","lisi","wangwu"]

B 左压栈
redisTemplate.opsForList().leftPush("nameList1","zhangsan");
redisTemplate.opsForList().leftPush("nameList1","lisi");
redisTemplate.opsForList().leftPush("nameList1","wangwu");
redisTemplate.opsForList().leftPush("nameList1","zhouliu");
结果: ["zhouliu","wangwu","lisi","zhangsan"]

//将字符串数组存入list
String[] strs = {"zhangsan","lisi","wangwu"};
redisTemplate.opsForList().leftPush("nameList",strs);

//取值
计数参数以下列方式影响操作:
count> 0:删除等于从头到尾移动的值的元素。
count <0:删除等于从尾到头移动的值的元素。
count = 0:删除等于value的所有元素。
A 获取所有元素
List<String> nameList = redisTemplate.opsForList().range("nameList",0,-1); 

B 获取某一个元素
List<String> nameList = redisTemplate.opsForList().range("nameList",1,1); // 获取索引为1 的元素 
结果: ["lisi"]

C 获取某一些元素
List<String> nameList = redisTemplate.opsForList().range("nameList",1,2);  
结果: ["zhangsan","lisi"]

D 获取list的元素数量
Long count = redisTemplate.opsForList().size("nameList); 
结果: 3

E 获取操作List之后的长度
Long count = redisTemplate.opsForList().rightPush("nameList","齐七"); 
结果: 4

F 根据索引获取值
String name = redisTemplate.opsForList().get("nameList",1); //获取索引为1的元素
结果: lisi

// 裁剪
// trim (a,b)  a代表需要被裁剪的第一个索引, b代表被裁减的最后一个索引, b =-1代表无 ,返回裁剪后的list
redisTemplate.opsForList().trim(1,-1); //只裁剪索引为1的元素, 
结果:["zhangsan","wangwu"]
redisTemplate.opsForList().trim(1,3);  //裁剪索引1到3的元素. 
结果: ["zhangsan"]

//弹出元素(删除的一种)
//弹出最左边元素
redistemplate.opsForList().leftPop("nameList");
//弹出最右边元素
redistemplate.opsForList().rightPop("nameList");

方法二:

//存值: 分左压栈和右压栈

A 右压栈
redisTemplate.boundListOps("nameList").rightPush("张三");
redisTempalte.boundListOps("nameList").rightPush("李四");
redisTemplate.boundListOps("nameList").rightPush("王五");
结果: ["张三","李四","王五"]

B 左压栈
redisTemplate.boundListOps("nameList2").leftPush("王五");
redisTemplate.boundListOps("nameList2").leftPush("李四");
redisTempalte.boundListOps("nameList2").leftPush("周六");
结果:["周六","李四","王五"]
	
//取值  

A 获取所有元素
// range是索引范围, 从第几个到第几个; 若要取全部数据,只能将第二个索引值写的大一点; 
//也可以试下-1 ,这个没尝试
List<String> nameList= redisTemplate.boundListOps("nameList").range(0,10);

B 根据索引取值
String  s = (String)redisTemplate.boundListOps("nameList").index(1);  
结果:李四

//删除其中一个元素
redisTemplate.boundListOps("nameList").remove(1, "李四");

(3) Set数据结构
无序,存储的顺序不一定相同

方法一:

//存值
A 单个存值
redisTemplate.opsForSet().add("nameSet", "张三");
B 多个存值
redisTemplate.opsForSet().add("nameSet","李四","王五","周六");

String[] nameArr = {"李四","王五","周六"};
redisTemplate.opsForSet().add("nameSet",nameArr);

//删除
redisTemplate.opsForSet().remove("nameSet","李四");
redisTemplate.opsForSet().remove("nameSet",nameArr);

//随机删除某一元素,并返回随机删除的元素
redisTemplate.opsForSet().pop("nameSet");

//取值
redisTemplate.opsForSet().members("nameSet");

//把一个元素aaa 从一个aaaSet 集合移到另一集合bbbSet
redisTemplate.opsForSet().move("aaaset","aaa","bbbSet);

//获取集合长度
redisTemplate.opsForSet().size("nameSet");

方法二:

//存值
redisTemplate.boundSetOps("nameSet").add("张三");
redisTemplate.boundSetOps("nameSet").add("李四");
redisTemplate.boundSetOps("nameSet").add("王五");

//取值
redisTemplate.boundSetOps("nameSet").numbers();

//删除其中一个
redisTemplate.boundSetOps("nameSet").remove("张三");

//删除全部
redisTemplate.delete("nameSet");

(4) ZSet数据结构

//存值
A 判断新增的值是否存在,存在是false , 不存在是true
语法: Boolean add(K key, V value, double score);
redisTemplate.opsForZset().add("numberZset","number1",1.0);
redisTemplate.opsForZset().add("numberZset","number2",1.1);
结果:true

//指定集合中某个元素排序
redisTemplate.opsForZset().rank("numberZset","number1");
结果: 0   //代表排序在第一位

(5) Hash数据结构 (key-value)
key 不能重复, value 可以重复

方法一:

//存值
redisTemplate.opsForHash().put("studentHash","name","zhangsan");
redisTemplate.opsForHash().put("studentHash","age","18");
redisTemplate.opsForHash().put("studentHush","class","高二<1>班");
redisTemplate.opsForHash().put("studentHush","number","001");

Map<String,Object> studentMap = new HashMap();
studentMap.put("name","lisi");
studentMap.put("age",17);
studentMap.put("number","002");
redisTemplate.opsForHash().putAll("studentHash",studentMap);


//取值
A 获取所有的键值对
redisTemplate.opsForHash().entries("studentHush); 
结果: {name="zhangsan",age=18, class="高二<1>班", number="001"}

B 获取所有的keys
redisTempalte.opsForHash().keys("studentHush");

C 获取的所有的values
redisTemplate.opsForHash().values("studentHush");

D 获取hush键值对的数量
redisTemplate.opsForHash().size("studentHush");

//删除
redisTemplate.opsForHash().delete("studentHush","number");

//判断 key 是否存在
Boolean hasKey = redisTemplate.opsForHash().hasKey("name");
结果: true

//迭代
Student<Map<String, Object>>redisTemplate.opsForHash().scan("studentHush",ScanOptions.ScanOptions.NONE);

方法二:

//存值
redisTemplate.boundHashOps("nameHash").put("学号1","张三");
redisTemplate.boundHashOps("nameHash").put("学号2","李四");
redisTemplate.boundHashOps("nameHash").put("学号3","王五");
redisTemplate.boundHashOps("nameHash").put("学号4","周六");

//取值
//获取所有的key
Set<String> keys = redisTemplate.boundHashOps("nameHash").keys();

//获取所有的value
List<String> values = redisTemplate.boundHashOps("nameHash").values();

//根据key获取value
String value1 = redisTemplate.boundHashOps("nameHash").get("学号1");

//删除某一个
redisTempalte.boundHashOps("nameHash").delete("学号1");

猜你喜欢

转载自blog.csdn.net/xinyuezitang/article/details/99626348