Redis常用的一些功能
Redis的特性 :
Strings:Strings 資料結構是簡單的key-value類型,value其實不僅是String,也可以是數字. 常用指令: set,get,decr,incr,mget 等。 常用方法:
-
清單内容
擷取字元串長度
往字元串append内容
設定和擷取字元串的某一段内容
設定及擷取字元串的某一位(bit)
批量設定一系列字元串的内容
Hashs:Redis Hash對應Value内部實際就是一個HashMap,常用指令:hget,hset,hgetall 等。
Lists:Redis list的實作為一個雙向連結清單,即可以支援反向查找和周遊,更友善操作,不過帶來了部分額外的記憶體開銷,Redis内部的很多實作,包括發送緩沖隊列等也都是用的這個資料結構。 常用指令:lpush,rpush,lpop,rpop,lrange等。
Sets:Sets 集合的概念就是一堆不重複值的組合。Redis還為集合提供了求交集、并集、差集等操作,可以非常友善的實作如共同關注、共同喜好、二度好友等功能。 常用指令:sadd,spop,smembers,sunion 等。
Sorted Sets:Redis sorted set的使用場景與set類似,差別是set不是自動有序的。sorted set可以通過使用者額外提供一個優先級(score)的參數來為成員排序,并且是插入有序的,即自動排序。 常用指令:zadd,zrange,zrem,zcard等
計數:
Redis是一個很好的計數器,計數器是 Redis 的原子性自增操作可實作的最直覺的模式了,它的想法相當簡單:每當某個操作發生時,向 Redis 發送一個 INCR 指令。使用場景比如網站的通路數,注冊使用者數,文章的點贊數,高并發的秒殺活動,分布式序列号生成等等統計計數的功能實作。Redis 解決這類計數問題得心應手,相比關系資料庫速度更快,消耗資源更少。還可以通過set()方法來重置計數。
存值:這裡這樣存表示用于用于計數,不然會報錯
stringRedisTemplate.opsForValue().set("test","testValue",10);
/*計數功能*/
@RequestMapping("/count")
@ResponseBody
public String count(){
ValueOperations<String,String> opsForValues=Template.opsForValue();
//沒有計數前得到的是Value 存進去的testValue值
System.out.println(opsForValues.get("test").equalsIgnoreCase("testValue"));
for (int i = 4; i < 100; i++) {
//計數,第一個參數為key值,第二個參數為每次增加計數的機關
//計數的開始的值是0
opsForValues.increment("test", 1);
}
//開始計數後得到的是計數
System.out.println(opsForValues.get("test")); //100
return "ok";
}
時間計數
有時候除了簡單的計數外,比如注冊使用者數需要按日統計,處理方法比較簡單,把日期帶入計數器 key 就可以。以此類推,還可以按其他方式進行統計計數,隻需要把統計的方式添加到key值就可以了
@RequestMapping("/count2")
@ResponseBody
public String count2(){
String key="test_"+new SimpleDateFormat("yyyy-MM-dd").format(new Date());
ValueOperations<String,String> opsForValues=Template.opsForValue();
//沒有計數前得到的是Value 存進去的testValue值
System.out.println(opsForValues.get(key));
for (int i = 0; i < 100; i++) {
//計數,第一個參數為key值,第二個參數為每次增加計數的機關
//不管
opsForValues.increment(key, 1);
}
//開始計數後得到的是計數
System.out.println(opsForValues.get(key)); //100
return "ok";
}
按模糊Key值查詢
在按條件統計計數的時候,把時間加入到了key值中,有時候要隻是查詢某個對象的統計數時,就可以使用模糊Key值查詢。
@RequestMapping("/like")
@ResponseBody
public String like(){
ValueOperations<String,String> opsForValues=Template.opsForValue();
//字首是user的key集合
Set<String> set=Template.keys("use*");
for (String s:set) {
String str=opsForValues.get(s);
//輸出每個key的value
}
return "ok";
}
使用hashs存儲擷取修改java對象
在實際開發中,我們經常将一些結構化的資訊打包成HashMap,在用戶端序列化後存儲為一個字元串的值,比如使用者的昵稱、年齡、性别、積分等,這時候在需要修改其中某一項時,通常需要将所有值取出反序列化後,修改某一項的值,再序列化存儲回去。這樣不僅增大了開銷,也不适用于一些可能并發操作的場合(比如兩個并發的操作都需要修改積分)。
而Redis的Hash結構可以使你像在資料庫中Update一個屬性一樣隻修改某一項屬性值。因為Redis的Hash結構是以對象的名字作為redis的key值,以對象的唯一屬性值作為hash的key值,以對象來作為redis的value值
@RequestMapping("/testHash")
@ResponseBody
public String testHash(){
User user=new User(1,"tom","123");
User user1=new User(2,"tom","123");
HashOperations<String,Object,Object> hashOperations=Template.opsForHash();
//把user=1的值改變
hashOperations.put("test",user.getId(),user1);
return "ok";
}
使用lists有序存儲讀取
用于擷取最近N個操作的資料。
@RequestMapping("/testList")
@ResponseBody
public String testList(){
//存儲有序
ListOperations<String,String> listOperations=Template.opsForList();
listOperations.leftPush("a","1");
listOperations.leftPush("a","2");
listOperations.leftPush("a","3");
listOperations.leftPush("a","4");
listOperations.leftPush("a","5");
listOperations.leftPush("a","6");
//保留5個key-value
listOperations.trim("a",0,4); //[6, 5, 4, 3, 2]
System.out.println(listOperations.range("a",0,listOperations.size("a")-1));
//
return "ok";
}
使用sets存儲讀取 無序 去重 求差集,交集,并集
//使用set存儲讀取 無序 去重 求差集,交集,并集
@RequestMapping("/testSet")
@ResponseBody
public String testSet(){
SetOperations<String,String> set=Template.opsForSet();
set.add("test7_1", "2", "1","2","3","4","4","3");
set.add("test7_2", "2", "6","2","3","7","6","5");
System.out.println("全部成員"+set.members("test7_1"));
System.out.println("差集"+set.difference("test7_1", "test7_2"));
System.out.println("交集"+set.intersect("test7_1", "test7_2"));
System.out.println("并集"+set.union("test7_1", "test7_2"));
return "ok";
}
Sorted Set 存取資料 排序
//Sorted Set 存取資料 排序 相比sets 儲存時多一個權重參數score,相當于按照此參數來排序
@RequestMapping("/testzSet")
@ResponseBody
public String testzSet(){
ZSetOperations<String, String> zSet = Template.opsForZSet();
zSet.add("test8", "use1", 9);
zSet.add("test8", "use2", 1);
zSet.add("test8", "use3", 5);
zSet.add("test8", "use4", 9);
//對應的score值增加
//zSet.incrementScore("test8", "use1", 1);
System.out.println(zSet.reverseRange("test8", 0, zSet.size("test8")-1));
//輸出[use4, use1, use3, use2] 從高到低的順序
return "ok";
}
原文位址 http://www.bieryun.com/3732.html