Redis和nosql简介,api调用;Redis数据功能(String类型的数据处理);List数据结构(及Java调用处理);Hash数据结构;Set数据结构功能;sortedSet(有序集合)数
1、Redis和nosql簡介,api調用
14.1/ nosql介紹
?
NoSQL:一類新出現的數據庫(not only sql),它的特點:
1、? 不支持SQL語法
2、? 存儲結構跟傳統關系型數據庫中的那種關系表完全不同,nosql中存儲的數據都是KV形式
3、? NoSQL的世界中沒有一種通用的語言,每種nosql數據庫都有自己的api和語法,以及擅長的業務場景
4、? NoSQL中的產品種類相當多:
a)????????Mongodb? 文檔型nosql數據庫,擅長做CMS系統(內容管理系統)
b)????????Redis??????? 內存數據庫,數據結構服務器,號稱瑞士軍刀(精巧),只要你有足夠的想象力,它可以還給你無限驚喜
c)????????Hbase? hadoop生態系統中原生的一種nosql數據庫,重量級的分布式nosql數據庫,用于海量數據的場景
d)????????Cassandra? hadoop生態系統中原生的一種分布式nosql數據庫,后起之秀
?
NoSQL和SQL數據庫的比較:
1、適用場景不同:sql數據庫適合用于關系特別復雜的數據查詢場景,nosql反之
2、“事務”特性的支持:sql對事務的支持非常完善,而nosql基本不支持事務
3、兩者在不斷地取長補短,呈現融合趨勢
?
?
14.2/ redis介紹
14.2.1 簡述
Redis是一個高性能的kv對緩存和內存數據庫(存的不像mysql那樣的表)
Redis的存儲結構就是key-value,形式如下:
注: redis中的value內部可以支持各種數據結構類型,比如可以存入一個普通的string,還可以存list,set,hashmap,sortedSet(有序的set)
?
14.2.2 redis應用場景
A、用來做緩存(ehcache/memcached)——redis的所有數據是放在內存中的(內存數據庫)
B、可以在某些特定應用場景下替代傳統數據庫——比如社交類的應用
C、在一些大型系統中,巧妙地實現一些特定的功能:session共享、購物車
只要你有豐富的想象力,redis可以用在可以給你無限的驚喜…….
?
?
14.2.3 redis的特性
1、redis數據訪問速度快(數據在內存中)
2、redis有數據持久化機制(持久化機制有兩種:1、定期將內存數據dump到磁盤;2、aof(append only file)持久化機制——用記日志的方式記錄每一條數據更新操作,一旦出現災難事件,可以通過日志重放來恢復整個數據庫)
3、redis支持集群模式(容量可以線性擴展)
4、redis相比其他緩存工具(ehcach/memcached),有一個鮮明的優勢:支持豐富的數據結構
14.3.Redis的api客戶端連接
新建一個maven工程,導入jedis的maven依賴坐標
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.2</version> <type>jar</type> <scope>compile</scope> </dependency> |
然后寫一個類用來測試服務器跟客戶端的連通性:
public class RedisClientConnectionTest { ???????? public static void main(String[] args) { ???????? ???????? // 構造一個redis的客戶端對象 ???????? ???????? Jedis jedis = new Jedis("pinshutang.zicp.net", 6379); ???????? ???????? String ping = jedis.ping(); ???????? ???????? System.out.println(ping); ???????? } } |
?
15、Redis數據功能(String類型的數據處理)
15.1 String類型的數據
(常作為緩存使用)
1/插入和讀取一條string類型的數據
redis notrue-centos:6379> set sessionid-0001 "zhangsan" OK redis notrue-centos:6379> get sessionid-0001 "zhangsan" |
?
2/對string類型數據進行增減(前提是這條數據的value可以看成數字)
192.168.106.80:6379> DECR key (integer) -1 192.168.106.80:6379> DECR key (integer) -2 192.168.106.80:6379> DECR key (integer) -3 192.168.106.80:6379> INCR key (integer) -2 192.168.106.80:6379> INCR key (integer) -1 ? 192.168.106.80:6379> DECRBY key 4 (integer) -5 192.168.106.80:6379> DECRBY key -7 (integer) 2 192.168.106.80:6379> INCRBY key 2 (integer) 4 192.168.106.80:6379> INCRBY key -9 (integer) -5 |
?
3/一次性插入或者獲取多條數據
192.168.106.80:6379> MSET key1 1 key2 2 key3 3 OK 192.168.106.80:6379> MGET key1 key2 key3 1) "1" 2) "2" 3) "3" |
?
4/在插入一條string類型數據的同時為它指定一個存活期限
setex key seconds value ? 例如: # bancao這條數據就只會存活10秒鐘,過期會被redis自動清除 192.168.106.80:6379> setex bancao 10 testvalue OK 192.168.106.80:6379> get bancao "testvalue" 192.168.106.80:6379> get bancao "testvalue" 192.168.106.80:6379> get bancao (nil) 192.168.106.80:6379> get bancao (nil) |
?
案例:
其中maven項目的pom文件的內容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ??? xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> ??? <modelVersion>4.0.0</modelVersion> ??? <groupId>cn.toto.redis</groupId> ??? <artifactId>redistest</artifactId> ??? <version>0.0.1-SNAPSHOT</version> ? ??? <dependencies> ? ?????? <!-- <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> ?????????? <version>2.7.2</version> <type>jar</type> <scope>compile</scope> </dependency> --> ? ?????? <dependency> ?????????? <groupId>redis.clients</groupId> ?????????? <artifactId>jedis</artifactId> ?????????? <version>2.8.0</version> ?????? </dependency> ? ?????? <dependency> ?????????? <groupId>com.google.code.gson</groupId> ?????????? <artifactId>gson</artifactId> ?????????? <version>2.3.1</version> ?????? </dependency> ?????? ?????? <dependency> ?????????? <groupId>junit</groupId> ?????????? <artifactId>junit</artifactId> ?????????? <version>4.7</version> ?????????? <scope>test</scope> ?????? </dependency> ??? </dependencies> </project> |
代碼:
package cn.toto.redis.client; ? import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; ? import org.junit.Before; import org.junit.Test; ? import com.google.gson.Gson; ? import cn.toto.redis.bean.ProductInfo; ? import redis.clients.jedis.Jedis; ? public class StringStructureData { ? ??? private Jedis jedis = null; ? ??? @Before ??? public void init() { ?????? //這里的是hadoop2可以用ip地址替換 ?????? jedis = new Jedis("hadoop2",6379); ?????? ??? } ??? ??? @Test ??? public void testString() { ?????? jedis.set("user02:name", "ruhua"); ?????? jedis.set("user03:name", "滑板鞋"); ?????? ?????? String u02 = jedis.get("user02:name"); ?????? String u03 = jedis.get("user03:name"); ?????? ?????? System.out.println(u02); ?????? System.out.println(u03); ??? } ??? ??? @Test ??? public void testObjectCache() throws Exception { ?????? ProductInfo p = new ProductInfo(); ?????? ?????? p.setName("username"); ?????? p.setDescription("備注信息"); ?????? p.setCatelog("unknow"); ?????? p.setPrice(10.8); ?????? ?????? //將對象序列化成字節數組 ?????? ByteArrayOutputStream ba = new ByteArrayOutputStream(); ?????? ObjectOutputStream oos = new ObjectOutputStream(ba); ?????? ?????? //用對象序列化流來將p對象序列化,然后把序列化之后的二進制數據寫到ba流中 ?????? oos.writeObject(p); ?????? ?????? //將ba流轉成byte數組 ?????? byte[] pBytes = ba.toByteArray(); ?????? ?????? //將對象序列化之后的byte數組存到redis的string結構數組中 ?????? jedis.set("product:01".getBytes(), pBytes); ?????? ?????? //根據key從redis中取出對象的byte數據 ?????? byte[] pBytesResp = jedis.get("product:01".getBytes()); ?????? ?????? ?????? //將byte數據反序列化列出對象 ?????? ByteArrayInputStream bi = new ByteArrayInputStream(pBytesResp); ?????? ObjectInputStream oi = new ObjectInputStream(bi); ?????? ?????? //從對象讀取流中取出對象 ?????? ProductInfo pResp = (ProductInfo) oi.readObject(); ?????? System.out.println(pResp); ??? } ??? ??? @Test ??? public void testObjectToJsonCache() { ?????? ProductInfo p = new ProductInfo(); ?????? ?????? p.setName("ABC"); ?????? p.setDescription("劉亦菲專用"); ?????? p.setCatelog("化妝品"); ?????? p.setPrice(10.8); ?????? ?????? //利用gson將對象轉成json串 ?????? Gson gson = new Gson(); ?????? String pJson = gson.toJson(p); ?????? ?????? //將json串存入redis ?????? jedis.set("prodcut:02", pJson); ?????? ?????? //從redis中取出對象的json串 ?????? String pJsonResp = jedis.get("prodcut:02"); ?????? ?????? //將返回的json解析成對象 ?????? ProductInfo pResponse = gson.fromJson(pJsonResp, ProductInfo.class); ?????? ?????? //顯示對象的屬性 ?????? System.out.println(pResponse); ??? } } |
?
16、List數據結構(及Java調用處理)
16.1 List圖示
?
16.2 List功能演示
#從頭部(左邊)插入數據 redis>LPUSH? key? value1? value2? value3??? #從尾部(右邊)插入數據 redis>RPUSH? key? value1? value2? value3?? #讀取list中指定范圍的values redis>LRANGE? key? start?? end redis> lrange? task-queue? 0? -1????? 讀取整個list #從頭部彈出一個元素 LPOP? key #從尾部彈出一個元素 RPOP? key #從一個list的尾部彈出一個元素插入到另一個list RPOPLPUSH?? key1??? key2???? ## 這是一個原子性操作 例如下面的案例: #從頭部(左邊)插入數據 192.168.106.81:6379> lpush task task0 task1 task2 (integer) 3 192.168.106.81:6379> lrange task 0 2 1) "task2" 2) "task1" 3) "task0" 192.168.106.81:6379> lrange task 0 -2 1) "task2" 2) "task1" 192.168.106.81:6379> lrange task 0 -1 1) "task2" 2) "task1" 3) "task0" #從尾部(右邊)插入數據 192.168.106.81:6379> rpush ids id0 id1 id2 (integer) 3 192.168.106.81:6379> lrange ids 0 -1 1) "id0" 2) "id1" 3) "id2" 192.168.106.81:6379> lpop ids "id0" 192.168.106.81:6379> lpop ids "id1" 192.168.106.81:6379> rpop task "task0" 192.168.106.81:6379> rpoplpush task ids "task1" 192.168.106.81:6379> lrange ids 0 -1 1) "task1" 2) "id2" 192.168.106.81:6379> |
?
16.3 List的應用案例demo
1 需求描述
任務調度系統:
生產者不斷產生任務,放入task-queue排隊
消費者不斷拿出任務來處理,同時放入一個tmp-queue暫存,如果任務處理成功,則清除tmp-queue,否則,將任務彈回task-queue
?
2 代碼實現
1/生產者
——模擬產生任務
package cn.toto.redis.productAndCustomer; ? import java.util.Random; import java.util.UUID; ? import redis.clients.jedis.Jedis; ? public class TaskProducer { ??? //獲取一個redis的客戶端連接對象 ??? public static Jedis getRedisConnection(String host,int port) { ?????? Jedis jedis = new Jedis(host,port); ?????? return jedis; ??? } ??? ??? public static void main(String[] args) { ?????? Jedis jedis = getRedisConnection("hadoop3", 6379); ?????? ?????? Random random = new Random(); ?????? //生成任務 ?????? while(true) { ?????????? try { ????????????? //生成任務的速度有一定的隨機性,在1-2秒之間 ????????????? Thread.sleep(random.nextInt(1000) + 1000); ????????????? //生成一個任務 ????????????? String taskid = UUID.randomUUID().toString(); ????????????? //往任務隊列"task-queue"中插入,第一次插入時,"task-queue"還不存在 ????????????? //但是lpush方法會在redis庫中創建一條新的list數據 ????????????? jedis.lpush("task-queue", taskid); ????????????? System.out.println("向任務隊列中插入了一個新的任務:" + taskid); ?????????? } catch (Exception e) { ????????????? e.printStackTrace(); ?????????? } ?????? } ??? } } |
?
2/消費者
——模擬處理任務,并且管理暫存隊列
package cn.toto.redis.productAndCustomer; ? import java.util.Random; ? import redis.clients.jedis.Jedis; ? public class TaskConsumer { ? ??? public static void main(String[] args) { ?????? Jedis jedis = new Jedis("hadoop3",6379); ?????? Random random = new Random(); ??? ??? ?????? while(true) { ?????????? try { ????????????? //從task-queue中取一個任務,同時放入tmp-queue ????????????? String taskid = jedis.rpoplpush("task-queue", "tmp-queue"); ????????????? ????????????? //模擬處理任務 ????????????? Thread.sleep(1000); ????????????? ????????????? //模擬有成功又有失敗的情況 ????????????? int nextInt = random.nextInt(13); ????????????? if (nextInt % 7 == 0) {//模擬失敗的情況 ????????????????? //在失敗的情況下,需要將任務從tmp-queue彈回"task-queue" ????????????????? jedis.rpoplpush("tmp-queue", "task-queue"); ????????????????? System.out.println("----任務處理失敗:" + taskid); ????????????? } else {//模擬成功的情況 ????????????????? //成功的情況下,將任務從"tmp-queue"清除 ????????????????? jedis.rpop("tmp-queue"); ????????????????? System.out.println("任務處理成功:" + taskid); ????????????? } ?????????? } catch (Exception e) { ????????????? e.printStackTrace(); ?????????? } ?????? } ??? } } |
?
上述機制是一個簡化版,真實版的任務調度系統會更加復雜,如下所示:
(增加了一個專門用來管理暫存隊列的角色,以便就算消費者程序失敗退出,那些處理失敗的任務依然可以被彈回task-queue)
?
17、Hash數據結構
17.1 Hash圖示
Redis中的Hashes類型可以看成具有String Key和String Value的map容器
?
17.2 Hash功能演示
1、往redis庫中插入一條hash類型的數據
redis> HSET ?key ?field ?value |
舉例:
redis 127.0.0.1:6379> hset user001:zhangsan? iphone ??6 (integer) 1 redis 127.0.0.1:6379> hset user001:zhangsan?? xiaomi ??7 (integer) 1 redis 127.0.0.1:6379> hset user001:zhangsan?? meizu ??8 (integer) 1 |
在redis庫中就形成了這樣一條數據:
?
2、從redis庫中獲取一條hash類型數據的value
ü?取出一條hash類型數據中所有field-value對
redis 127.0.0.1:6379> hgetall user001:zhangsan 1) "iphone" 2) "6" 3) "xiaomi" 4) "7" 5) "meizu" 6) "8" |
?
ü?取出hash數據中所有fields
redis 127.0.0.1:6379> HKEYS user001:zhangsan 1) "iphone" 2) "xiaomi" 3) "meizu" |
?
ü?取出hash數據中所有的value
redis 127.0.0.1:6379> hvals user001:zhangsan 1) "6" 2) "7" 3) "8" |
?
ü?取出hash數據中一個指定field的值
redis 127.0.0.1:6379> hget user001:zhangsan xiaomi "8" |
?
ü?為hash數據中指定的一個field的值進行增減
redis 127.0.0.1:6379> HINCRBY user001:zhangsan xiaomi 1 (integer) 8 |
?
ü?從hash數據中刪除一個字段field及其值
redis 127.0.0.1:6379> hgetall user001:zhangsan 1) "iphone" 2) "6" 3) "xiaomi" 4) "7" 5) "meizu" 6) "8" redis 127.0.0.1:6379> HDEL user001:zhangsan iphone (integer) 1 redis 127.0.0.1:6379> hgetall user001:zhangsan 1) "xiaomi" 2) "7" 3) "meizu" 4) "8" |
?
18、Set數據結構功能
集合的特點:無序、無重復元素
1、? 插入一條set數據
redis 127.0.0.1:6379> sadd frieds:zhangsan? bingbing baby fengjie furong ruhua tingting (integer) 6 redis 127.0.0.1:6379> scard frieds:zhangsan (integer) 6 redis 127.0.0.1:6379> ? |
?
2、獲取一條set數據的所有members
redis 127.0.0.1:6379> smembers frieds:zhangsan 1) "fengjie" 2) "baby" 3) "furong" 4) "bingbing" 5) "tingting" 6) "ruhua" |
?
3、判斷一個成員是否屬于某條指定的set數據
redis 127.0.0.1:6379> sismember frieds:zhangsan liuyifei???? #如果不是,則返回0 (integer) 0 redis 127.0.0.1:6379> sismember frieds:zhangsan baby?????? #如果是,則返回1 (integer) 1 |
?
4、求兩個set數據的差集
#求差集 redis 127.0.0.1:6379> sdiff ?frieds:zhangsan ?friends:xiaotao 1) "furong" 2) "fengjie" 3) "ruhua" 4) "feifei" #求差集,并將結果存入到另一個set redis 127.0.0.1:6379> sdiffstore zhangsan-xiaotao frieds:zhangsan friends:xiaotao (integer) 4 #查看差集結果 redis 127.0.0.1:6379> smembers zhangsan-xiaotao 1) "furong" 2) "fengjie" 3) "ruhua" 4) "feifei" |
?
5、? 求交集,求并集
#求交集 redis 127.0.0.1:6379> sinterstore zhangsan:xiaotao frieds:zhangsan friends:xiaotao (integer) 2 redis 127.0.0.1:6379> smembers zhangsan:xiaotao 1) "bingbing" 2) "baby" ? #求并集 redis 127.0.0.1:6379> sunion? frieds:zhangsan friends:xiaotao ?1) "fengjie" ?2) "tangwei" ?3) "liuyifei" ?4) "bingbing" ?5) "ruhua" ?6) "feifei" ?7) "baby" ?8) "songhuiqiao" ?9) "furong" 10) "yangmi" |
案例代碼:
package cn.toto.redis.hashcart; ? import java.util.Map; import java.util.Map.Entry; import java.util.Set; ? import org.junit.Before; import org.junit.Test; ? import redis.clients.jedis.Jedis; ? public class BuyCartServiceImpl { ??? ??? private Jedis jedis = null; ??? private static final String CART_PRIFIX = "cart:"; ??? ??? @Before ??? public void init() { ?????? jedis = new Jedis("hadoop3",6379); ??? } ??? ??? /** ??? ?* 添加商品到購物車 ??? ?*/ ??? @Test ??? public void testAddItemToCart() { ?????? jedis.hset(CART_PRIFIX + "user02", "上衣", "2"); ?????? jedis.hset(CART_PRIFIX + "user02", "鞋子", "1"); ?????? jedis.hset(CART_PRIFIX + "user02", "毛衣", "3"); ?????? jedis.hset(CART_PRIFIX + "user02", "羽絨服", "4"); ?????? ?????? jedis.close(); ??? } ??? ??? /** ??? ?* 查看購物車信息,當本類中的其它單元測試執行完成之后,可以通過執行這個單元測試方法查看內容 ??? ?* @author toto ??? ?* @date 2017-1-14 ??? ?* @note? begin modify by 涂作權 2017-1-14? 原始創建 ??? ?*/ ??? @Test ??? public void testGetCartInfo() { ?????? Map<String, String> cart = jedis.hgetAll(CART_PRIFIX + "user02"); ?????? Set<Entry<String, String>> entrySet = cart.entrySet(); ?????? for(Entry<String, String> ent : entrySet) { ?????????? System.out.println(ent.getKey() + ":" + ent.getValue()); ?????? } ?????? jedis.close(); ??? } ??? ??? /** ??? ?* 編輯緩存中的內容 ??? ?*/ ??? @Test ??? public void editCart() { ?????? //給蠟燭商品項的數量加1 ?????? jedis.hincrBy(CART_PRIFIX + "user02", "羽絨服", 1); ?????? jedis.close(); ??? } ??? ??? /** ??? ?* 刪除內存中上衣這個內容 ??? ?*/ ??? @Test ??? public void delItemFromCart() { ?????? jedis.hdel(CART_PRIFIX + "user02", "上衣"); ?????? jedis.close(); ??? } } |
生產者消費者:
生產者: package cn.toto.redis.listqueue; ? import java.util.Random; import java.util.UUID; ? import redis.clients.jedis.Jedis; ? public class TaskProducer { ??? private static Jedis jedis = null; ??? ??? public static void main(String[] args) throws Exception { ?????? jedis = new Jedis("hadoop2",6379); ?????? Random random = new Random(); ?????? ?????? while(true) { ?????????? int nextInt = random.nextInt(1000); ?????????? Thread.sleep(1000 + nextInt); ?????????? ?????????? //生成一個任務的id ?????????? String taskid = UUID.randomUUID().toString(); ?????????? ?????????? jedis.lpush("task-queue", taskid); ?????????? ?????????? System.out.println("生成了一個任務:" + taskid); ?????? } ??? } } |
消費者: package cn.toto.redis.listqueue; ? import java.util.Random; ? import redis.clients.jedis.Jedis; ? /** ?* @brief TaskProcessor.java 任務處理模塊 ?*/ public class TaskProcessor { ??? ??? private static Jedis jedis = null; ??? ??? public static void main(String[] args) throws Exception { ?????? Random random = new Random(); ?????? ?????? jedis = new Jedis("hadoop2",6379); ?????? ?????? while(true) { ?????????? Thread.sleep(1500); ?????????? ?????????? //從任務隊列中取出一個任務,同時放入到暫存隊列中 ?????????? String taskid = jedis.rpoplpush("task-queue", "tmp-queue"); ?????????? ?????????? //處理任務 ?????????? if (random.nextInt(19) % 9 == 0) { ????????????? //模擬失敗 ????????????? //失敗的情況下,需要將任務從暫存隊列彈回任務隊列 ????????????? jedis.rpoplpush("tmp-queue", "task-queue"); ????????????? System.out.println("該任務處理失敗:" + taskid); ?????????? } else { ????????????? //模擬成功 ????????????? //成功的情況下,只需要將任務從暫存隊列清除 ????????????? jedis.rpop("tmp-queue"); ????????????? System.out.println("任務處理成功:" + taskid); ?????????? } ?????? } ??? } } |
Set的案例:
package cn.toto.redis.set; ? import java.util.Set; ? import redis.clients.jedis.Jedis; ? public class TestSet { ??? ??? public static void main(String[] args) { ??? ??? Jedis jedis = new Jedis("hadoop2",6379); ??? ??? ??? ??? jedis.sadd("friends:shuangshuang", "dandan","lulu","lili"); ??? ??? jedis.sadd("friends:laobi", "laowang","laodu","laoli","lili","lulu"); ??? ??? ??? ??? //判斷一個成員是否屬于指定的集合 ??? ??? Boolean isornot = jedis.sismember("friends:laobi", "shuangshuang"); ??? ??? System.out.println(isornot); ??? ??? ??? ??? //求兩個集合的差并交集 ??? ??? Set<String> ssDiffbb = jedis.sdiff("friends:shuangshuang","friends:laobi"); ?????? Set<String> ssUnionbb = jedis.sunion("friends:shuangshuang","friends:laobi"); ?????? Set<String> ssInterbb = jedis.sinter("friends:shuangshuang","friends:laobi"); ?????? ?????? //打印結果 ?????? for (String mb : ssUnionbb) { ?????????? System.out.println(mb); ?????? } ??? } } |
?
?
19、sortedSet(有序集合)數據結構
19.1 sortedSet圖示
sortedset中存儲的成員都有一個附帶的分數值
而redis就可以根據分數來對成員進行各種排序(正序、倒序)
?
1、? sortedSet存儲內容示意圖:
?
19.2 SortedSet功能演示
1、往redis庫中插入一條sortedset數據
redis 127.0.0.1:6379> zadd nansheng:yanzhi:bang? 70 liudehua? 90 huangbo? 100 weixiaobao? 250 yangwei? 59 xiaotao (integer) 5 ? |
?
2、? 從sortedset中查詢有序結果
#正序結果 redis 127.0.0.1:6379> zrange nansheng:yanzhi:bang ?0 ?4 1) "xiaotao" 2) "liudehua" 3) "huangbo" 4) "weixiaobao" 5) "yangwei" #倒序結果 redis 127.0.0.1:6379> zrevrange nanshen:yanzhi:bang 0 4 1) "yangwei" 2) "weixiaobao" 3) "huangbo" 4) "liudehua" 5) "xiaotao" |
?
3、? 查詢某個成員的名次
#在正序榜中的名次 redis 127.0.0.1:6379> zrank nansheng:yanzhi:bang ?xiaotao (integer) 0 ? #在倒序榜中的名次 redis 127.0.0.1:6379> zrevrank nansheng:yanzhi:bang xiaotao (integer) 4 |
?
4、修改成員的分數
redis 127.0.0.1:6379> zincrby nansheng:yanzhi:bang ?300 ?xiaotao "359" redis 127.0.0.1:6379> zrevrank nansheng:yanzhi:bang xiaotao (integer) 0 |
案例:
下面的這個先運行: package cn.toto.redis.sortedset; ? import java.util.Random; ? import redis.clients.jedis.Jedis; ? public class LolBoxPlayer { ??? ??? public static void main(String[] args) throws Exception { ?????? Jedis jedis = new Jedis("hadoop2",6379); ?????? ?????? Random random = new Random(); ?????? String[] heros = {"易大師","德邦","劍姬","蓋倫","阿卡麗","金克斯","提莫","猴子","亞索"}; ?????? while(true) { ?????????? int index = random.nextInt(heros.length); ?????????? //選擇一個英雄 ?????????? String hero = heros[index]; ?????????? ?????????? //開始玩游戲 ?????????? Thread.sleep(1000); ?????????? ?????????? //給集合中的該英雄的出場次數加1 ?????????? //第一次添加的時候,集合不存在,zincrby方法會創建 ?????????? jedis.zincrby("hero:ccl:phb", 1, hero); ?????????? ?????????? System.out.println(hero + "出場了......"); ?????? } ??? } } |
下面的這個后運行: package cn.toto.redis.sortedset; ? import java.util.Set; ? import redis.clients.jedis.Jedis; import redis.clients.jedis.Tuple; ? public class LolBoxViewer { ??? ??? public static void main(String[] args) throws Exception { ?????? Jedis jedis = new Jedis("hadoop2",6379); ?????? ?????? int i = 1; ?????? while(true) { ?????????? //每隔3秒查看一次榜單 ?????????? Thread.sleep(3000); ?????????? System.out.println("第" + i + "次查看榜單-----------"); ?????????? ?????????? //從redis中查詢榜單的前N名 ?????????? Set<Tuple> topHeros = jedis.zrevrangeWithScores("hero:ccl:phb", 0, 4); ?????????? ?????????? for (Tuple t : topHeros) { ????????????? System.out.println(t.getElement() + "? " + t.getScore()); ?????????? } ?????????? ?????????? i++; ?????????? ?????????? System.out.println(""); ?????????? System.out.println(""); ?????????? System.out.println(""); ?????? } ??? } } |
總結
以上是生活随笔為你收集整理的Redis和nosql简介,api调用;Redis数据功能(String类型的数据处理);List数据结构(及Java调用处理);Hash数据结构;Set数据结构功能;sortedSet(有序集合)数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 请写出新加坡的服饰种类和具体内容(华族、
- 下一篇: 中国发展轰20轰炸机刻不容缓?