日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

redis java应用_Java+Redis应用(第一章)

發(fā)布時(shí)間:2024/9/15 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis java应用_Java+Redis应用(第一章) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。