一 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");