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