redis java应用_Java+Redis应用(第一章)
hello: 大家好
我是1987 今天我給大家?guī)鞪ava + Redis 應(yīng)用,這些都是我平時的總結(jié)),希望對大家有用。
首先: 我?guī)Т蠹液唵蔚牧私庖幌翿edis
Redis常用數(shù)據(jù)類型(最為常用的數(shù)據(jù)類型主要有以下五種)
●String
●Hash
●List
●Set
●Sorted set
下面我們先來逐一的分析下這五種數(shù)據(jù)類型的使用和內(nèi)部實現(xiàn)方式:
1、String
常用命令:
set,get,decr,incr,mget 等。
常用方法:
set -- 設(shè)置key對應(yīng)的的值為String類型的value
get -- 獲取對應(yīng)key對應(yīng)的String的值,如果不存在返回nil
setnx -- 設(shè)置可以為對應(yīng)的值為String類型的value,如果key存在返回0不覆蓋,不存在返回1
setex -- 置key對應(yīng)的值為String類型的value,并指定此鍵值對應(yīng)的有效期
SETEX key seconds value
例:setex mykey 10 你好
setrange -- 設(shè)置key的value的子字符串
setrange -- key 位置 替換的內(nèi)容如果替換內(nèi)容沒有原value長,則原value剩余的內(nèi)容將被保留
mset -- 一次設(shè)置多個key的值,成功返回ok,失敗返回0,要成功都成功,要不成功全部失 敗。
例:mset key1 內(nèi)容一 key2 內(nèi)容二
msetnx -- 一次設(shè)置多個key的值,成功返回ok,失敗返回0,不覆蓋已經(jīng)存在的值,要成功都 成功,要失敗都失敗。
getset -- 設(shè)置key的值并返回key的舊值
例:getset key newValuse
getrange -- 獲取key對應(yīng)的value子字符串
例:getrange key 0 5 //獲取前6個字符
mget -- 批量獲取
例:mget key1 key2 key3 //沒有設(shè)置則返回空
incr -- 對key的值做增加操作,并返回新的值
incrby -- 對可以的value加指定的值,key如果不存在會設(shè)置key并value為0
例:incrby key1 5 //對key1的值加5
decr -- 對key的值做減減操作-1
decrby -- 對key的值減去指定值
append -- 給指定key的字符串追加value,返回新的字符串長度
strlen -- 取指定key的value值的長度
應(yīng)用場景:
String是最常用的一種數(shù)據(jù)類型,普通的key/value存儲都可以歸為此類,value其實不僅是String,也可以是數(shù)字。比如想知道什么時候封鎖一個IP地址(訪問超過幾次)。incrby命令讓這些變得很容易,通過原子遞增保持計數(shù)。常規(guī)計數(shù): 微博數(shù), 粉絲數(shù)
Hashs
在Memcached中,我們經(jīng)常將一些結(jié)構(gòu)化的信息打包成hashmap,在客戶端序列化后存儲為一個字符串的值,比如用戶的昵稱、年齡、性別、積分等,這時候在需要修改其中某一項時,通常需要將所有值取出反序列化后,修改某一項的值,再序列化存儲回去。這樣不僅增大了開銷,也不適用于一些可能并發(fā)操作的場合(比如兩個并發(fā)的操作都需要修改積分)。而Redis的Hash結(jié)構(gòu)可以使你像在數(shù)據(jù)庫中Update一個屬性一樣只修改某一項屬性值。它是一個String類型的field和value的映射表,它的添加和刪除都是平均的,hash特別適合用于存儲對象,對于將對象存儲成字符串而言,hash會占用更少的內(nèi)存,并且可以更方便的存取整個對象. 它和java的HashMap完全類似
常用命令:
hget,hset,hgetall 等。
常用方法:
hset -- 設(shè)置一個hash 的field為指定值,如果key不存在則先創(chuàng)建
例:hset tab ke1 val1
hget -- 獲取某個hash的某個field值
例:hget tab ke1
hsetnx -- 類似string只是操作的是hash
hmset -- 批量設(shè)置hash的內(nèi)容
hmget -- 獲取hash表的全部key值
例:Hmget key field1 field2
hincrby -- 給hash表的某個字段增加值
hexists -- 判斷hash表中某個key是否存在
hlen -- 返回hash表中的key數(shù)量
hdel -- 刪除指定hash表的某個鍵值對
hkeys -- 返回hash表中所有的key
hvals -- 返回hash表中所有的value
hgetall -- 獲取hash表中所有key和value
使用場景:
存儲部分變更數(shù)據(jù)。如用戶信息等。
Lists
Lists 就是鏈表,略有數(shù)據(jù)結(jié)構(gòu)知識的人都應(yīng)該能理解其結(jié)構(gòu)。使用Lists結(jié)構(gòu),我們可以輕松地實現(xiàn)最新消息排行等功能。Lists的另一個應(yīng)用就是消息隊列,可以利用Lists的PUSH操作,將任務(wù)存在Lists中,然后工作線程再用POP操作將任務(wù)取出進(jìn)行執(zhí)行。Redis還提供了操作Lists中某一段的api,你可以直接查詢,刪除Lists中某一段的元素。Redis的list是每個子元素都是String類型的雙向鏈表,可以通過push和pop操作從列表的頭部或者尾部添加或者刪除元素,這樣List即可以作為棧,也可以作為隊列。
Redis list的實現(xiàn)為一個雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過帶來了部分額外的內(nèi)存開銷,Redis內(nèi)部的很多實現(xiàn),包括發(fā)送緩沖隊列等也都是用的這個數(shù)據(jù)結(jié)構(gòu)。
常用命令:
lpush,rpush,lpop,rpop,lrange等。
常用方法:
lpush -- 在key所對應(yīng)的list頭部添加一個元素 ==》l的意思是left
rpush -- 在key說對應(yīng)的list尾部添加一個元素 ==》r的意思是right
lrange -- 顯示list里面的內(nèi)容
例:lrange 0 -1 //全部顯示
linsert -- 在key對應(yīng)的list
例:linsert mylist before one myvalue
lset -- 設(shè)置list中指定下標(biāo)元素的值
例:lset mylist index myvalue
lrem -- 從key對應(yīng)的list中刪除n個和value相同的元素,結(jié)果返回影響元素的個數(shù),n<0從尾部開 始刪除,n=0全刪除
例:lrem mylist count "value"
ltrim -- 保留指定key范圍內(nèi)的數(shù)據(jù),返回ok成功
例:ltrim mylist 0 3 //0-3是保留的范圍
lpop -- 從list的頭部刪除一個元素,并返回該刪除的元素
rpop -- 從list的尾部彈出一個元素,并返回該刪除的元素
rpoplpush -- 從第一個list的尾部元素異常元素并添加到第二個list的頭部
例:rpoplpush mylistA mylistB
lindex -- 返回list位置的元素
例:lindex mylist 3
llen -- 返回list中元素的個數(shù)
例:llen mylist
使用場景
消息隊列系統(tǒng)
使用list可以構(gòu)建隊列系統(tǒng),使用sorted set甚至可以構(gòu)建有優(yōu)先級的隊列系統(tǒng)。
比如:將Redis用作日志收集器
實際上還是一個隊列,多個端點(diǎn)將日志信息寫入Redis,然后一個worker統(tǒng)一將所有日志寫到磁盤。
Set
常用命令:
sadd,spop,smembers,sunion 等。
實現(xiàn)方式:
set 的內(nèi)部實現(xiàn)是一個 value永遠(yuǎn)為null的HashMap,實際就是通過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內(nèi)的原因。set中的元素是沒有順序的。
常用方法:
sadd -- 向名稱為key的set中添加元素,返回影響元素的個數(shù),0為失敗,1為成功
例:sadd myset value
smembers -- 查看集合中所有的成員
例:smebers myset
srem -- 刪除集合的一個元素
例:srem myset two
spop -- 隨機(jī)返回并刪除set中一個元素
例:spop myset
sdiff -- 返回所有set與第一個set的差集
例:sdiff myset1 myset2
sdiffstore -- 比較差集并且存儲到另一個set中,返回1代表成功
例:sdiffstore setstoreSet mySet1 myset2
sinter -- 返回所有給定集合的交集
例:sinter myset1 mysert2 //1集合和2集合的交集
sinterstore -- 返回給定集合的交集并存儲到另一個集合
例:sinterstore desset myset1 myset2 //存到desset集合中
sunion -- 返回所有給定集合的并集
例:sunion set1 set2
sunionstore -- 返回所有的并集并且存儲到另一個集合中,返回影響的元素個數(shù)
例:sunionstore destSet myset1 myset2
smove --把第一個集合的元素移動到第二個集合中
例:smove myset myset 你好
scard -- 返回集合中元素的個數(shù)
例:scard myset1
sismember --測試某個元素是否在集合中,返回0是不是,大于0是存在
例:sismember mykey1 你好
srandmember -- 隨機(jī)返回個集合中的元素
例:srandmemeber myset1
應(yīng)用場景:
Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在于set是可以自動排重的,當(dāng)你需要存儲一個列表數(shù)據(jù),又不希望出現(xiàn)重復(fù)數(shù)據(jù)時,set是一個很好的選擇,并且set提供了判斷某個成員是否在一個set集合內(nèi)的重要接口,這個也是list所不能提供的。
Sorted Sets
常用命令:
zadd,zrange,zrem,zcard等
實現(xiàn)方式:
Redis sorted
set的內(nèi)部使用HashMap和跳躍表(SkipList)來保證數(shù)據(jù)的存儲和有序,HashMap里放的是成員到score的映射,而跳躍表里存放的是所有的成員,排序依據(jù)是HashMap里存的score,使用跳躍表的結(jié)構(gòu)可以獲得比較高的查找效率,并且在實現(xiàn)上比較簡單。
常用方法:
zadd -- 向zset中添加元素member,score 用于排序,如果元素存在,則更新其順序,返回0代 表沒添加成功
例:ZADD key score member
zadd myset 3 itim
zrange -- 取出集合中的元素
例:zrange myset 0 -1 withscores//顯示序號
zrem -- 刪除名稱為key的zset中的元素member
例:zrem myset itim
zincrby -- 修改元素的排序,如果元素不存在則添加該元素,且排序的score值為增加值
例:zincrby myzset score itim
zrank -- 返回元素在集合中的排序位置,就是索引值
例:zrank myzset itim //itim在集合中的位置
zrevrank -- 返回從大到小的排序索引值,就是逆序位置
例:zrevrangk myzset itim//逆序的位置
zrevrange -- 返回集合中從大到小排序(降序)的,索引start到end的所有元素
例:zrevrange myzset 0 -1 //逆序后的元素
zrangebyscore -- 根據(jù)排序索引的scores來返回元素
例:zrangebyscore myzset 1 3 withscores//
zcount -- 返回集合中給定區(qū)間的數(shù)量
例:zcount myzset 2 4 //集合中2-4索引元素的個數(shù)
zcard -- 返回集合中所有元素的個數(shù)
例:zcard myzset //返回所有元素的個數(shù)
zremrangebyrank -- 刪除集合中排序在給定區(qū)間的所有元素(按索引刪除)
例:zremrangebyrank myzset 2 3 //
zremrangebyscore -- 刪除集合中在給定排序區(qū)間的元素 (按順序刪除)
例:zremrangebyscore myzset 2 5 //
使用場景:
Redis sorted set的使用場景與set類似,區(qū)別是set不是自動有序的,而sorted set可以通過用戶額外提供一個優(yōu)先級(score)的參數(shù)來為成員排序,并且是插入有序的,即自動排序。當(dāng)你需要一個有序的并且不重復(fù)的集合列表,那么可以選擇sorted set數(shù)據(jù)結(jié)構(gòu)。
和Sets相比,Sorted Sets增加了一個權(quán)重參數(shù)score,使得集合中的元素能夠按score進(jìn)行有序排列,比如一個存儲全班同學(xué)成績的Sorted Sets,其集合value可以是同學(xué)的學(xué)號,而score就可以是其考試得分,這樣在數(shù)據(jù)插入集合的時候,就已經(jīng)進(jìn)行了天然的排序。可以用Sorted Sets來做帶權(quán)重的隊列,比如普通消息的score為1,重要消息的score為2,然后工作線程可以選擇按score的倒序來獲取工作任務(wù)。讓重要的任務(wù)優(yōu)先執(zhí)行。
總結(jié):
1.根據(jù)業(yè)務(wù)需要選擇合適的數(shù)據(jù)類型,并為不同的應(yīng)用場景設(shè)置相應(yīng)的緊湊存儲參數(shù)。
2.當(dāng)業(yè)務(wù)場景不需要數(shù)據(jù)持久化時,關(guān)閉所有的持久化方式可以獲得最佳的性能以及最大的內(nèi)存使用量。
3.如果需要使用持久化,根據(jù)是否可以容忍重啟丟失部分?jǐn)?shù)據(jù)在快照方式與語句追加方式之間選擇其一,不要使用虛擬內(nèi)存以及diskstore方式。
4.不要讓你的Redis所在機(jī)器物理內(nèi)存使用超過實際內(nèi)存總量的3/5。
總結(jié)
以上是生活随笔為你收集整理的redis java应用_Java+Redis应用(第一章)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 委托机制_通过反射实现Java
- 下一篇: java jxl 写 excel_Jav