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