redis操作常用
使用Java操作Redis需要jedis-2.1.0.jar,下載地址:http://files.cnblogs.com/liuling/jedis-2.1.0.jar.zip
如果需要使用Redis連接池的話,還需commons-pool-1.5.4.jar,下載地址:http://files.cnblogs.com/liuling/commons-pool-1.5.4.jar.zip
?
刪除都是以del(String)
?
package com.test;
?
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
?
import org.junit.Before;
import org.junit.Test;
?
import redis.clients.jedis.Jedis;
?
public class TestRedis {
???private Jedis jedis;
???
???@Before
???public void setup() {
???????//連接redis服務(wù)器,192.168.0.100:6379
???????jedis = new Jedis("192.168.0.100", 6379);
???????//權(quán)限認證
???????jedis.auth("admin");?
??? }
???
???/**
????* redis存儲字符串
????*/
???@Test
???public void testString() {
???????//-----添加數(shù)據(jù)----------?
???????jedis.set("name","xinxin");//向key-->name中放入了value-->xinxin?
???????System.out.println(jedis.get("name"));//執(zhí)行結(jié)果:xinxin?
???????
???????jedis.append("name", " is my lover"); //拼接
???????System.out.println(jedis.get("name"));
???????
???????jedis.del("name");? //刪除某個鍵
???????System.out.println(jedis.get("name"));
???????//設(shè)置多個鍵值對
???????jedis.mset("name","liuling","age","23","qq","476777XXX");
???????jedis.incr("age"); //進行加1操作
???????System.out.println(jedis.get("name") + "-" +jedis.get("age") + "-" + jedis.get("qq"));
???????
??? }
???
???/**
????* redis操作Map
????*/
???@Test
???public void testMap() {
???????//-----添加數(shù)據(jù)----------?
???????Map<String, String> map = new HashMap<String, String>();
???????map.put("name", "xinxin");
???????map.put("age", "22");
???????map.put("qq", "123456");
???????jedis.hmset("user",map);
???????//取出user中的name,執(zhí)行結(jié)果:[minxr]-->注意結(jié)果是一個泛型的List?
???????//第一個參數(shù)是存入redis中map對象的key,后面跟的是放入map中的對象的key,后面的key可以跟多個,是可變參數(shù)?
???????List<String> rsmap = jedis.hmget("user","name", "age", "qq");
???????System.out.println(rsmap);?
?
???????//刪除map中的某個鍵值?
???????jedis.hdel("user","age");
???????System.out.println(jedis.hmget("user", "age")); //因為刪除了,所以返回的是null?
???????System.out.println(jedis.hlen("user")); //返回key為user的鍵中存放的值的個數(shù)2
???????System.out.println(jedis.exists("user"));//是否存在key為user的記錄 返回true?
???????System.out.println(jedis.hkeys("user"));//返回map對象中的所有key?
???????System.out.println(jedis.hvals("user"));//返回map對象中的所有value
?
???????Iterator<String>iter=jedis.hkeys("user").iterator();?
???????while (iter.hasNext()){?
???????????String key = iter.next();?
???????????System.out.println(key+":"+jedis.hmget("user",key));?
???????}?
??? }
???
???/**
????* jedis操作List
????*/?
???@Test?
???public void testList(){?
???????//開始前,先移除所有的內(nèi)容?
???????jedis.del("java framework");?
???????System.out.println(jedis.lrange("java framework",0,-1));?
???????//先向key java framework中存放三條數(shù)據(jù)?
???????jedis.lpush("java framework","spring");?
???????jedis.lpush("java framework","struts");?
???????jedis.lpush("java framework","hibernate");?
???????//再取出所有數(shù)據(jù)jedis.lrange是按范圍取出,?
???????// 第一個是key,第二個是起始位置,第三個是結(jié)束位置,jedis.llen獲取長度 -1表示取得所有?
???????System.out.println(jedis.lrange("java framework",0,-1));?
???????
???????jedis.del("java framework");
???????jedis.rpush("java framework","spring");?
???????jedis.rpush("java framework","struts");?
???????jedis.rpush("java framework","hibernate");
???????System.out.println(jedis.lrange("java framework",0,-1));
???}?
???
???/**
????* jedis操作Set
????*/?
???@Test?
???public void testSet(){?
???????//添加?
???????jedis.sadd("user","liuling");?
???????jedis.sadd("user","xinxin");?
???????jedis.sadd("user","ling");?
???????jedis.sadd("user","zhangxinxin");
???????jedis.sadd("user","who");?
???????//移除noname?
???????jedis.srem("user","who");?
???????System.out.println(jedis.smembers("user"));//獲取所有加入的value?
???????System.out.println(jedis.sismember("user","who"));//判斷 who 是否是user集合的元素?
???????System.out.println(jedis.srandmember("user"));?
???????System.out.println(jedis.scard("user"));//返回集合的元素個數(shù)?
???}?
?
???@Test?
???public void test() throws InterruptedException {?
???????//jedis 排序?
???????//注意,此處的rpush和lpush是List的操作。是一個雙向鏈表(但從表現(xiàn)來看的)?
???????jedis.del("a");//先清除數(shù)據(jù),再加入數(shù)據(jù)進行測試?
???????jedis.rpush("a", "1");?
? ??????jedis.lpush("a","6");?
???????jedis.lpush("a","3");?
???????jedis.lpush("a","9");?
???????System.out.println(jedis.lrange("a",0,-1));// [9, 3, 6,1]?
???????System.out.println(jedis.sort("a")); //[1, 3, 6, 9]? //輸入排序后結(jié)果?
???????System.out.println(jedis.lrange("a",0,-1));?
???}?
???
???@Test
???public void testRedisPool() {
???????RedisUtil.getJedis().set("newname", "中文測試");
???????System.out.println(RedisUtil.getJedis().get("newname"));
??? }
}
?
?
?
?
?
一、常用數(shù)據(jù)類型簡介:
? ?? redis常用五種數(shù)據(jù)類型:string,hash,list,set,zset(sorted?set).
1.String類型
String是最簡單的類型,一個key對應一個value
String類型的數(shù)據(jù)最大1G。
String類型的值可以被視作integer,從而可以讓“INCR”命令族操作(incrby、decr、decrby),這種情況下,該integer的值限制在64位有符號數(shù)。
在list、set和zset中包含的獨立的元素類型都是Redis?String類型。
2.List類型
鏈表類型,主要功能是push、pop、獲取一個范圍的所有值等。其中的key可以理解為鏈表的名字。
在Redis中,list就是Redis?String的列表,按照插入順序排序。比如使用LPUSH命令在list頭插入一個元素,使用RPUSH命令在list的尾插入一個元素。當這兩個命令之一作用于一個空的key時,一個新的list就創(chuàng)建出來了。
List的最大長度是2^32-1個元素。
3.Set類型
集合,和數(shù)學中的集合概念相似。操作中的key理解為集合的名字。
在Redis中,set就是Redis?String的無序集合,不允許有重復元素。
Set的最大元素數(shù)是2^32-1。
Redis中對set的操作還有交集、并集、差集等。
4.ZSet(Sorted?Set)類型
Zset是set的一個升級版本,在set的基礎(chǔ)上增加了一個順序?qū)傩?#xff0c;這一屬性在添加修改元素時可以指定,每次指定后zset會自動安裝指定值重新調(diào)整順序。可以理解為一張表,一列存value,一列存順序。操作中的key理解為zset的名字。
Zset的最大元素數(shù)是2^32-1。
對于已經(jīng)有序的zset,仍然可以使用SORT命令,通過指定ASC|DESC參數(shù)對其進行排序。
5.hash類型
hash是最接近關(guān)系數(shù)據(jù)庫結(jié)構(gòu)的數(shù)據(jù)類型,可以將數(shù)據(jù)庫一條記錄或程序中一個對象轉(zhuǎn)換成hashmap存放在redis中。
二、jedis操作命令:
1.對value操作的命令
?????exists(key):確認一個key是否存在
?????del(key):刪除一個key
?????type(key):返回值的類型
?????keys(pattern):返回滿足給定pattern的所有key
?????randomkey:隨機返回key空間的一個key
?????rename(oldname,?newname):將key由oldname重命名為newname,若newname存在則刪除newname表示的key
?????dbsize:返回當前數(shù)據(jù)庫中key的數(shù)目
?????expire:設(shè)定一個key的活動時間(s)
?????ttl:獲得一個key的活動時間
?????select(index):按索引查詢
?????move(key,?dbindex):將當前數(shù)據(jù)庫中的key轉(zhuǎn)移到有dbindex索引的數(shù)據(jù)庫
?????flushdb:刪除當前選擇數(shù)據(jù)庫中的所有key
?????flushall:刪除所有數(shù)據(jù)庫中的所有key
2.對String操作的命令
?????set(key,?value):給數(shù)據(jù)庫中名稱為key的string賦予值value
?????get(key):返回數(shù)據(jù)庫中名稱為key的string的value
?????getset(key,?value):給名稱為key的string賦予上一次的value
?????mget(key1,?key2,…,?key?N):返回庫中多個string(它們的名稱為key1,key2…)的value
?????setnx(key,?value):如果不存在名稱為key的string,則向庫中添加string,名稱為key,值為value
?????setex(key,?time,?value):向庫中添加string(名稱為key,值為value)同時,設(shè)定過期時間time
?????mset(key1,?value1,?key2,?value2,…key?N,?value?N):同時給多個string賦值,名稱為key?i的string賦值value?i
?????msetnx(key1,?value1,?key2,?value2,…key?N,?value?N):如果所有名稱為key?i的string都不存在,則向庫中添加string,名稱 ? ? ? ? ?key?i賦值為value?i
?????incr(key):名稱為key的string增1操作
?????incrby(key,?integer):名稱為key的string增加integer
?????decr(key):名稱為key的string減1操作
?????decrby(key,?integer):名稱為key的string減少integer
?????append(key,?value):名稱為key的string的值附加value
?????substr(key,?start,?end):返回名稱為key的string的value的子串
3.對List操作的命令
?????rpush(key,?value):在名稱為key的list尾添加一個值為value的元素
?????lpush(key,?value):在名稱為key的list頭添加一個值為value的?元素
?????llen(key):返回名稱為key的list的長度
?????lrange(key,?start,?end):返回名稱為key的list中start至end之間的元素(下標從0開始,下同)
?????ltrim(key,?start,?end):截取名稱為key的list,保留start至end之間的元素
?????lindex(key,?index):返回名稱為key的list中index位置的元素
?????lset(key,?index,?value):給名稱為key的list中index位置的元素賦值為value
?????lrem(key,?count,?value):刪除count個名稱為key的list中值為value的元素。count為0,刪除所有值為value的元素,count>0 ? ? ?從頭至尾刪除count個值為value的元素,count<0從尾到頭刪除|count|個值為value的元素。
?????lpop(key):返回并刪除名稱為key的list中的首元素
?????rpop(key):返回并刪除名稱為key的list中的尾元素
?????blpop(key1,?key2,…?key?N,?timeout):lpop 命令的block版本。即當timeout為0時,若遇到名稱為key?i的list不存在或該list為空,則命令結(jié)束。如果 timeout>0,則遇到上述情況時,等待timeout秒,如果問題沒有解決,則對key?i+1開始的list執(zhí)行pop操作。
?????brpop(key1,?key2,…?key?N,?timeout):rpop的block版本。參考上一命令。
?????rpoplpush(srckey,?dstkey):返回并刪除名稱為srckey的list的尾元素,并將該元素添加到名稱為dstkey的list的頭部
4.對Set操作的命令
?????sadd(key,?member):向名稱為key的set中添加元素member
?????srem(key,?member)?:刪除名稱為key的set中的元素member
?????spop(key)?:隨機返回并刪除名稱為key的set中一個元素
?????smove(srckey,?dstkey,?member)?:將member元素從名稱為srckey的集合移到名稱為dstkey的集合
?????scard(key)?:返回名稱為key的set的基數(shù)
?????sismember(key,?member)?:測試member是否是名稱為key的set的元素
?????sinter(key1,?key2,…key?N)?:求交集
?????sinterstore(dstkey,?key1,?key2,…key?N)?:求交集并將交集保存到dstkey的集合
?????sunion(key1,?key2,…key?N)?:求并集
?????sunionstore(dstkey,?key1,?key2,…key?N)?:求并集并將并集保存到dstkey的集合
?????sdiff(key1,?key2,…key?N)?:求差集
?????sdiffstore(dstkey,?key1,?key2,…key?N)?:求差集并將差集保存到dstkey的集合
?????smembers(key)?:返回名稱為key的set的所有元素
?????srandmember(key)?:隨機返回名稱為key的set的一個元素
5.對zset(sorted?set)操作的命令
?????zadd(key,?score,?member):向名稱為key的zset中添加元素member,score用于排序。如果該元素已經(jīng)存在,則根據(jù)score更新該元素的順序。
?????zrem(key,?member)?:刪除名稱為key的zset中的元素member
?????zincrby(key,?increment,?member)?:如果在名稱為key的zset中已經(jīng)存在元素member,則該元素的score增加increment;否則向集合中添加該元素,其score的值為increment
?????zrank(key,?member)?:返回名稱為key的zset(元素已按score從小到大排序)中member元素的rank(即index,從0開始),若沒有member元素,返回“nil”
?????zrevrank(key,?member)?:返回名稱為key的zset(元素已按score從大到小排序)中member元素的rank(即index,從0開始),若沒有member元素,返回“nil”
?????zrange(key,?start,?end):返回名稱為key的zset(元素已按score從小到大排序)中的index從start到end的所有元素
?????zrevrange(key,?start,?end):返回名稱為key的zset(元素已按score從大到小排序)中的index從start到end的所有元素
?????zrangebyscore(key,?min,?max):返回名稱為key的zset中score?>=?min且score?<=?max的所有元素
?????zcard(key):返回名稱為key的zset的基數(shù)
?????zscore(key,?element):返回名稱為key的zset中元素element的score
?????zremrangebyrank(key,?min,?max):刪除名稱為key的zset中rank?>=?min且rank?<=?max的所有元素
?????zremrangebyscore(key,?min,?max)?:刪除名稱為key的zset中score?>=?min且score?<=?max的所有元素
?????zunionstore?/?zinterstore(dstkeyN,?key1,…,keyN,?WEIGHTS?w1,…wN,?AGGREGATE?SUM|MIN|MAX):對N個zset求并集和交集,并將最后的集合保存在dstkeyN中。對于集合中每一個元素的score,在進行AGGREGATE運算前,都要乘以對于的WEIGHT參數(shù)。如果沒有提供WEIGHT,默認為1。默認的AGGREGATE是SUM,即結(jié)果集合中元素的score是所有集合對應元素進行 SUM運算的值,而MIN和MAX是指,結(jié)果集合中元素的score是所有集合對應元素中最小值和最大值。
6.對Hash操作的命令
?????hset(key,?field,?value):向名稱為key的hash中添加元素field<—>value
?????hget(key,?field):返回名稱為key的hash中field對應的value
?????hmget(key,?field1,?…,field?N):返回名稱為key的hash中field?i對應的value
?????hmset(key,?field1,?value1,…,field?N,?value?N):向名稱為key的hash中添加元素field?i<—>value?i
?????hincrby(key,?field,?integer):將名稱為key的hash中field的value增加integer
?????hexists(key,?field):名稱為key的hash中是否存在鍵為field的域
?????hdel(key,?field):刪除名稱為key的hash中鍵為field的域
?????hlen(key):返回名稱為key的hash中元素個數(shù)
?????hkeys(key):返回名稱為key的hash中所有鍵
?????hvals(key):返回名稱為key的hash中所有鍵對應的value
?????hgetall(key):返回名稱為key的hash中所有的鍵(field)及其對應的value
三、各種數(shù)據(jù)類型所對應的應用場景
1.String類型的應用場景
? ?String是最常用的一種數(shù)據(jù)類型,普通的key/value存儲.
2.list類型的應用場景
? ?比較適用于列表式存儲且順序相對比較固定,例如:
省份、城市列表
品牌、廠商、車系、車型等列表
拆車坊專題列表...
3.set類型的應用場景
? ?Set對外提供的功能與list類似,當需要存儲一個列表數(shù)據(jù),又不希望出現(xiàn)重復數(shù)據(jù)時,可選用set
4.zset(sorted?set)類型的應用場景
zset的使用場景與set類似,區(qū)別是set不是自動有序的,而zset可以通過用戶額外提供一個優(yōu)先級(score)的參數(shù)來為成員排序,并且是插入有序的,即自動排序.當你需要一個有序的并且不重復的集合列表,那么可以選擇zset數(shù)據(jù)結(jié)構(gòu)。例如:
根據(jù)PV排序的熱門車系車型列表
根據(jù)時間排序的新聞列表
5.hash類型的應用場景
類似于表記錄的存儲
頁面視圖所需數(shù)據(jù)的存儲
四、具體使用參考示例:
? privatevoid testKey() {
???????System.out.println("=============key==========================");
??????? //?清空數(shù)據(jù)
???????System.out.println(jedis.flushDB());
???????System.out.println(jedis.echo("foo"));
??????? //?判斷key否存在
???????System.out.println(shardedJedis.exists("foo"));
???????shardedJedis.set("key", "values");
???????System.out.println(shardedJedis.exists("key"));
??? }
?
??? privatevoid testString() {
???????System.out.println("=============String==========================");
??????? //?清空數(shù)據(jù)
???????System.out.println(jedis.flushDB());
??????? //?存儲數(shù)據(jù)
???????shardedJedis.set("foo", "bar");
???????System.out.println(shardedJedis.get("foo"));
??????? //?若key不存在,則存儲
???????shardedJedis.setnx("foo", "foo not exits");
???????System.out.println(shardedJedis.get("foo"));
??????? //?覆蓋數(shù)據(jù)
??????? shardedJedis.set("foo","foo update");
???????System.out.println(shardedJedis.get("foo"));
??????? //?追加數(shù)據(jù)
???????shardedJedis.append("foo", " hello, world");
???????System.out.println(shardedJedis.get("foo"));
??????? //?設(shè)置key的有效期,并存儲數(shù)據(jù)
???????shardedJedis.setex("foo", 2, "foo not exits");
???????System.out.println(shardedJedis.get("foo"));
??????? try {
???????????Thread.sleep(3000);
??????? }catch (InterruptedException e) {
??????? }
???????System.out.println(shardedJedis.get("foo"));
??????? //?獲取并更改數(shù)據(jù)
???????shardedJedis.set("foo", "foo update");
???????System.out.println(shardedJedis.getSet("foo", "foomodify"));
??????? //?截取value的值
???????System.out.println(shardedJedis.getrange("foo", 1, 3));
??????? System.out.println(jedis.mset("mset1","mvalue1", "mset2", "mvalue2", "mset3","mvalue3", "mset4", "mvalue4"));
???????System.out.println(jedis.mget("mset1", "mset2","mset3", "mset4"));
???????System.out.println(jedis.del(new String[] { "foo","foo1", "foo3" }));
??? }
?
??? privatevoid testList() {
???????System.out.println("=============list==========================");
??????? //?清空數(shù)據(jù)
???????System.out.println(jedis.flushDB());
??????? //?添加數(shù)據(jù)
???????shardedJedis.lpush("lists", "vector");
??????? shardedJedis.lpush("lists","ArrayList");
???????shardedJedis.lpush("lists", "LinkedList");
??????? //?數(shù)組長度
???????System.out.println(shardedJedis.llen("lists"));
??????? //?排序
???????System.out.println(shardedJedis.sort("lists"));
??????? //?字串
??????? System.out.println(shardedJedis.lrange("lists",0, 3));
??????? //?修改列表中單個值
???????shardedJedis.lset("lists", 0, "hello list!");
??????? //?獲取列表指定下標的值
???????System.out.println(shardedJedis.lindex("lists", 1));
??????? //?刪除列表指定下標的值
???????System.out.println(shardedJedis.lrem("lists", 1,"vector"));
??????? //?刪除區(qū)間以外的數(shù)據(jù)
???????System.out.println(shardedJedis.ltrim("lists", 0, 1));
??????? //?列表出棧
???????System.out.println(shardedJedis.lpop("lists"));
??????? //?整個列表值
??????? System.out.println(shardedJedis.lrange("lists",0, -1));
?
??? }
?
??? privatevoid testSet() {
???????System.out.println("=============set==========================");
??????? //?清空數(shù)據(jù)
???????System.out.println(jedis.flushDB());
??????? //?添加數(shù)據(jù)
??????? shardedJedis.sadd("sets","HashSet");
???????shardedJedis.sadd("sets", "SortedSet");
???????shardedJedis.sadd("sets", "TreeSet");
??????? //?判斷value是否在列表中
???????System.out.println(shardedJedis.sismember("sets","TreeSet"));
??????? ;
??????? //?整個列表值
??? ????System.out.println(shardedJedis.smembers("sets"));
??????? //?刪除指定元素
???????System.out.println(shardedJedis.srem("sets","SortedSet"));
??????? //?出棧
???????System.out.println(shardedJedis.spop("sets"));
???????System.out.println(shardedJedis.smembers("sets"));
??????? //
???????shardedJedis.sadd("sets1", "HashSet1");
???????shardedJedis.sadd("sets1", "SortedSet1");
???????shardedJedis.sadd("sets1", "TreeSet");
???????shardedJedis.sadd("sets2", "HashSet2");
??????? shardedJedis.sadd("sets2","SortedSet1");
???????shardedJedis.sadd("sets2", "TreeSet1");
??????? //?交集
???????System.out.println(jedis.sinter("sets1", "sets2"));
??????? //?并集
???????System.out.println(jedis.sunion("sets1", "sets2"));
??????? //?差集
??? ????System.out.println(jedis.sdiff("sets1","sets2"));
??? }
?
??? privatevoid testSortedSet() {
???????System.out.println("=============zset==========================");
??????? //?清空數(shù)據(jù)
???????System.out.println(jedis.flushDB());
??????? //?添加數(shù)據(jù)
?????? ?shardedJedis.zadd("zset", 10.1,"hello");
???????shardedJedis.zadd("zset", 10.0, ":");
???????shardedJedis.zadd("zset", 9.0, "zset");
???????shardedJedis.zadd("zset", 11.0, "zset!");
??????? //?元素個數(shù)
???????System.out.println(shardedJedis.zcard("zset"));
??????? //?元素下標
???????System.out.println(shardedJedis.zscore("zset","zset"));
??????? //?集合子集
???????System.out.println(shardedJedis.zrange("zset", 0, -1));
??????? //?刪除元素
???????System.out.println(shardedJedis.zrem("zset","zset!"));
??????? System.out.println(shardedJedis.zcount("zset",9.5, 10.5));
??????? //?整個集合值
???????System.out.println(shardedJedis.zrange("zset", 0, -1));
??? }
?
??? privatevoid testHash() {
???????System.out.println("=============hash==========================");
?? ?????//?清空數(shù)據(jù)
???????System.out.println(jedis.flushDB());
??????? //?添加數(shù)據(jù)
???????shardedJedis.hset("hashs", "entryKey","entryValue");
???????shardedJedis.hset("hashs", "entryKey1","entryValue1");
???????shardedJedis.hset("hashs", "entryKey2","entryValue2");
??????? //?判斷某個值是否存在
???????System.out.println(shardedJedis.hexists("hashs","entryKey"));
??????? //?獲取指定的值
???????System.out.println(shardedJedis.hget("hashs","entryKey"));??????? //?批量獲取指定的值
???????System.out.println(shardedJedis.hmget("hashs","entryKey", "entryKey1"));
??????? //?刪除指定的值
???????System.out.println(shardedJedis.hdel("hashs","entryKey"));
??????? //?為key中的域?field?的值加上增量?increment
???????System.out.println(shardedJedis.hincrBy("hashs","entryKey", 123l));
??????? //?獲取所有的keys
???????System.out.println(shardedJedis.hkeys("hashs"));
??????? //?獲取所有的values
???????System.out.println(shardedJedis.hvals("hashs"));
??? }
總結(jié)
- 上一篇: springmvc和mybatis面试题
- 下一篇: Kali 安装