生活随笔
收集整理的這篇文章主要介紹了
redis缓存的安装和使用
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)自:http://blog.csdn.net/catoop/article/details/7549911
Redis介紹 ??? Redis本質(zhì)上一個(gè)Key/Value數(shù)據(jù)庫,與Memcached類似的NoSQL型數(shù)據(jù)庫,但是他的數(shù)據(jù)可以持久化的保存在磁盤上,解決了服務(wù)重啟后數(shù)據(jù)不丟失的問題,他的值可以是string(字符串)、list(列表)、sets(集合)或者是ordered? sets(被排序的集合),所有的數(shù)據(jù)類型都具有push/pop、add/remove、執(zhí)行服務(wù)端的并集、交集、兩個(gè)sets集中的差別等等操作,這些操作都是具有原子性的,Redis還支持各種不同的排序能力 ??? Redis 2.0更是增加了很多新特性,如:提升了性能、增加了新的數(shù)據(jù)類型、更少的利用內(nèi)存(AOF和VM) ??? Redis支持絕大部分主流的開發(fā)語言,如:C、Java、C#、PHP、Perl、Python、Lua、Erlang、Ruby等等 ??? 官網(wǎng):http://code.google.com/p/redis/ Redis性能 ??? 根據(jù)Redis官方的測試結(jié)果:在50個(gè)并發(fā)的情況下請求10w次,寫的速度是110000次/s,讀的速度是81000次/s 地址:http://code.google.com/p/redis/wiki/Benchmarks 一、安裝過程: 最新穩(wěn)定版,Redis 2.0.4 stable wget http://redis.googlecode.com/files/redis-2.6.7.tar.gz (其他版本到官網(wǎng)下載即可) tar zxf redis-2.6.7.tar.gz cd redis-2.6.7 與其它軟件不同的是,不需要configure。 make 裝完了。 創(chuàng)建一個(gè)目錄 mkdir /usr/local/redis2 cd src cp redis-server redis-benchmark redis-cli ../redis.conf /usr/local/redis2
二、啟動與停止:
cd /usr/local/redis2
啟動 ./redis-server > /dev/null & 或者 ./redis-server redis.conf 或者 ./redis-server redis.conf 1>log.log 2>errlog.log (1為標(biāo)準(zhǔn)輸出,2為錯(cuò)誤輸出)
停止 ./redis-cli shutdown
客戶端連接 ./redis-cli
三、測試: 存值: ./redis-cli set hx value 取值: ./redis-cli get hx
> quit 退出連接
> dbsize (integer) 12
當(dāng)前數(shù)據(jù)庫中key的數(shù)量
> info 服務(wù)器基本信息
monitor
實(shí)時(shí)轉(zhuǎn)儲收到的請求
config get 獲取服務(wù)器的參數(shù)配置
flushdb 清空當(dāng)前數(shù)據(jù)庫
flushall
清除所有數(shù)據(jù)庫
?
四、附注
redis.conf配置文件: 引用 #是否作為守護(hù)進(jìn)程運(yùn)行 daemonize yes #配置pid的存放路徑及文件名,默認(rèn)為當(dāng)前路徑下 pidfile redis.pid #Redis默認(rèn)監(jiān)聽端口 port 6379 #客戶端閑置多少秒后,斷開連接 timeout 300 #日志顯示級別 loglevel verbose #指定日志輸出的文件名,也可指定到標(biāo)準(zhǔn)輸出端口 logfile stdout #設(shè)置數(shù)據(jù)庫的數(shù)量,默認(rèn)連接的數(shù)據(jù)庫是0,可以通過select N來連接不同的數(shù)據(jù)庫 databases 16 #保存數(shù)據(jù)到disk的策略 #當(dāng)有一條Keys數(shù)據(jù)被改變是,900秒刷新到disk一次 save 900 1 #當(dāng)有10條Keys數(shù)據(jù)被改變時(shí),300秒刷新到disk一次 save 300 10 #當(dāng)有1w條keys數(shù)據(jù)被改變時(shí),60秒刷新到disk一次 save 60 10000 #當(dāng)dump? .rdb數(shù)據(jù)庫的時(shí)候是否壓縮數(shù)據(jù)對象 rdbcompression yes #dump數(shù)據(jù)庫的數(shù)據(jù)保存的文件名 dbfilename dump.rdb #Redis的工作目錄 dir /home/falcon/redis-2.0.0/ ###########? Replication ##################### #Redis的復(fù)制配置 # slaveof <masterip> <masterport> # masterauth <master-password> ############## SECURITY ########### # requirepass foobared ############### LIMITS ############## #最大客戶端連接數(shù) # maxclients 128 #最大內(nèi)存使用率 # maxmemory <bytes> ########## APPEND ONLY MODE ######### #是否開啟日志功能 appendonly no # 刷新日志到disk的規(guī)則 # appendfsync always appendfsync everysec # appendfsync no ################ VIRTUAL MEMORY ########### #是否開啟VM功能 vm-enabled no # vm-enabled yes vm-swap-file logs/redis.swap vm-max-memory 0 vm-page-size 32 vm-pages 134217728 vm-max-threads 4 ############# ADVANCED CONFIG ############### glueoutputbuf yes hash-max-zipmap-entries 64 hash-max-zipmap-value 512 #是否重置Hash表 activerehashing yes 五、redis所有常用命令
[html] view plaincopy
常規(guī)操作命令?? ??? 01??exits?key??????????????//測試指定key是否存在,返回1表示存在,0不存在?? 02??del?key1?key2?....keyN?//刪除給定key,返回刪除key的數(shù)目,0表示給定key都不存在?? 03??type?key???????????????//返回給定key的value類型。返回?none?表示不存在key,string字符類型,list?鏈表類型?set?無序集合類型...?? 04??keys?pattern???????????//返回匹配指定模式的所有key,下面給個(gè)例子?? 05??randomkey??????????????//返回從當(dāng)前數(shù)據(jù)庫中隨機(jī)選擇的一個(gè)key,如果當(dāng)前數(shù)據(jù)庫是空的,返回空串?? 06??rename?oldkey?newkey???//原子的重命名一個(gè)key,如果newkey存在,將會被覆蓋,返回1表示成功,0失敗。可能是oldkey不存在或者和newkey相同?? 07??renamenx?oldkey?newkey?//同上,但是如果newkey存在返回失敗?? 08??dbsize?????????????????//返回當(dāng)前數(shù)據(jù)庫的key數(shù)量?? 09??expire?key?seconds?????//為key指定過期時(shí)間,單位是秒。返回1成功,0表示key已經(jīng)設(shè)置過過期時(shí)間或者不存在?? 10??ttl?key????????????????//返回設(shè)置過過期時(shí)間的key的剩余過期秒數(shù)?-1表示key不存在或者沒有設(shè)置過過期時(shí)間?? 11??select?db-index????????//通過索引選擇數(shù)據(jù)庫,默認(rèn)連接的數(shù)據(jù)庫所有是0,默認(rèn)數(shù)據(jù)庫數(shù)是16個(gè)。返回1表示成功,0失敗?? 12??move?key?db-index??????//將key從當(dāng)前數(shù)據(jù)庫移動到指定數(shù)據(jù)庫。返回1成功。0?如果key不存在,或者已經(jīng)在指定數(shù)據(jù)庫中?? 13??flushdb????????????????//刪除當(dāng)前數(shù)據(jù)庫中所有key,此方法不會失敗。慎用?? 14??flushall???????????????//刪除所有數(shù)據(jù)庫中的所有key,此方法不會失敗。更加慎用?? string?類型數(shù)據(jù)操作命令?? ??? 01??set?key?value?????????//設(shè)置key對應(yīng)的值為string類型的value,返回1表示成功,0失敗?? 02??setnx?key?value???????//同上,如果key已經(jīng)存在,返回0?。nx?是not?exist的意思?? 03??get?key???????????????//獲取key對應(yīng)的string值,如果key不存在返回nil?? 04??getset?key?value??????//原子的設(shè)置key的值,并返回key的舊值。如果key不存在返回nil?? 05??mget?key1?key2?...?keyN????????????//一次獲取多個(gè)key的值,如果對應(yīng)key不存在,則對應(yīng)返回nil。下面是個(gè)實(shí)驗(yàn),首先清空當(dāng)前數(shù)據(jù)庫,然后設(shè)置k1,k2.獲取時(shí)k3對應(yīng)返回nil?? 06??mset?key1?value1?...?keyN?valueN???//一次設(shè)置多個(gè)key的值,成功返回1表示所有的值都設(shè)置了,失敗返回0表示沒有任何值被設(shè)置?? 07??msetnx?key1?value1?...?keyN?valueN?//同上,但是不會覆蓋已經(jīng)存在的key?? 08??incr?key??????????????//對key的值做加加操作,并返回新的值。注意incr一個(gè)不是int的value會返回錯(cuò)誤,incr一個(gè)不存在的key,則設(shè)置key為1?? 09??decr?key??????????????//同上,但是做的是減減操作,decr一個(gè)不存在key,則設(shè)置key為-1?? 10??incrby?key?integer????//同incr,加指定值?,key不存在時(shí)候會設(shè)置key,并認(rèn)為原來的value是?0?? 11??decrby?key?integer????//同decr,減指定值。decrby完全是為了可讀性,我們完全可以通過incrby一個(gè)負(fù)值來實(shí)現(xiàn)同樣效果,反之一樣。?? 12??append?key?value??????//給指定key的字符串值追加value,返回新字符串值的長度。下面給個(gè)例子?? 13??substr?key?start?end??//返回截取過的key的字符串值,注意并不修改key的值。下標(biāo)是從0開始的,接著上面例子?? list?類型數(shù)據(jù)操作命令?? ??? 01??lpush?key?string??????????//在key對應(yīng)list的頭部添加字符串元素,返回1表示成功,0表示key存在且不是list類型?? 02??rpush?key?string??????????//同上,在尾部添加?? 03??llen?key??????????????????//返回key對應(yīng)list的長度,key不存在返回0,如果key對應(yīng)類型不是list返回錯(cuò)誤?? 04??lrange?key?start?end??????//返回指定區(qū)間內(nèi)的元素,下標(biāo)從0開始,負(fù)值表示從后面計(jì)算,-1表示倒數(shù)第一個(gè)元素?,key不存在返回空列表?? 05??ltrim?key?start?end???????//截取list,保留指定區(qū)間內(nèi)元素,成功返回1,key不存在返回錯(cuò)誤?? 06??lset?key?index?value??????//設(shè)置list中指定下標(biāo)的元素值,成功返回1,key或者下標(biāo)不存在返回錯(cuò)誤?? 07??lrem?key?count?value??????//從key對應(yīng)list中刪除count個(gè)和value相同的元素。count為0時(shí)候刪除全部?? 08??lpop?key??????????????????//從list的頭部刪除元素,并返回刪除元素。如果key對應(yīng)list不存在或者是空返回nil,如果key對應(yīng)值不是list返回錯(cuò)誤?? 09??rpop??????????????????????//同上,但是從尾部刪除?? 10??blpop?key1...keyN?timeout?//從左到右掃描返回對第一個(gè)非空list進(jìn)行l(wèi)pop操作并返回,比如blpop?list1?list2?list3?0?,如果list不存在list2,list3都是非空則對list2做lpop并返回從list2中刪除的元素。如果所有的list都是空或不存在,則會阻塞timeout秒,timeout為0表示一直阻塞。當(dāng)阻塞時(shí),如果有client對key1...keyN中的任意key進(jìn)行push操作,則第一在這個(gè)key上被阻塞的client會立即返回。如果超時(shí)發(fā)生,則返回nil。有點(diǎn)像unix的select或者poll?? 11??brpop?????????????????????//同blpop,一個(gè)是從頭部刪除一個(gè)是從尾部刪除?? 12??rpoplpush?srckey?destkey??//從srckey對應(yīng)list的尾部移除元素并添加到destkey對應(yīng)list的頭部,最后返回被移除的元素值,整個(gè)操作是原子的.如果srckey是空或者不存在返回nil?? set?類型數(shù)據(jù)操作命令?? ??? 01??sadd?key?member????????????????//添加一個(gè)string元素到,key對應(yīng)的set集合中,成功返回1,如果元素以及在集合中返回0,key對應(yīng)的set不存在返回錯(cuò)誤?? 02??srem?key?member????????????????//從key對應(yīng)set中移除給定元素,成功返回1,如果member在集合中不存在或者key不存在返回0,如果key對應(yīng)的不是set類型的值返回錯(cuò)誤?? 03??spop?key???????????????????????//刪除并返回key對應(yīng)set中隨機(jī)的一個(gè)元素,如果set是空或者key不存在返回nil?? 04??srandmember?key????????????????//同spop,隨機(jī)取set中的一個(gè)元素,但是不刪除元素?? 05??smove?srckey?dstkey?member?????//從srckey對應(yīng)set中移除member并添加到dstkey對應(yīng)set中,整個(gè)操作是原子的。成功返回1,如果member在srckey中不存在返回0,如果key不是set類型返回錯(cuò)誤?? 06??scard?key??????????????????????//返回set的元素個(gè)數(shù),如果set是空或者key不存在返回0?? 07??sismember?key?member???????????//判斷member是否在set中,存在返回1,0表示不存在或者key不存在?? 08??sinter?key1?key2...keyN????????//返回所有給定key的交集?? 09??sinterstore?dstkey?key1...keyN?//同sinter,但是會同時(shí)將交集存到dstkey下?? 10??sunion?key1?key2...keyN????????//返回所有給定key的并集?? 11??sunionstore?dstkey?key1...keyN?//同sunion,并同時(shí)保存并集到dstkey下?? 12??sdiff?key1?key2...keyN?????????//返回所有給定key的差集?? 13??sdiffstore?dstkey?key1...keyN??//同sdiff,并同時(shí)保存差集到dstkey下?? 14??smembers?key???????????????????//返回key對應(yīng)set的所有元素,結(jié)果是無序的?? sorted?set?類型數(shù)據(jù)操作命令?? ??? 01??zadd?key?score?member????????//添加元素到集合,元素在集合中存在則更新對應(yīng)score?? 02??zrem?key?member??????????????//刪除指定元素,1表示成功,如果元素不存在返回0?? 03??zincrby?key?incr?member??????//增加對應(yīng)member的score值,然后移動元素并保持skip?list保持有序。返回更新后的score值?? 04??zrank?key?member?????????????//返回指定元素在集合中的排名(下標(biāo)),集合中元素是按score從小到大排序的?? 05??zrevrank?key?member??????????//同上,但是集合中元素是按score從大到小排序?? 06??zrange?key?start?end?????????//類似lrange操作從集合中去指定區(qū)間的元素。返回的是有序結(jié)果?? 07??zrevrange?key?start?end??????//同上,返回結(jié)果是按score逆序的?? 08??zrangebyscore?key?min?max????//返回集合中score在給定區(qū)間的元素?? 09??zcount?key?min?max???????????//返回集合中score在給定區(qū)間的數(shù)量?? 10??zcard?key????????????????????//返回集合中元素個(gè)數(shù)?? 11??zscore?key?element???????????//返回給定元素對應(yīng)的score?? 12??zremrangebyrank?key?min?max??//刪除集合中排名在給定區(qū)間的元素?? 13??zremrangebyscore?key?min?max?//刪除集合中score在給定區(qū)間的元素?? hash?類型數(shù)據(jù)操作命令?? ??? 01??hset?key?field?value???????//設(shè)置hash?field為指定值,如果key不存在,則先創(chuàng)建?? 02??hget?key?field?????????????//獲取指定的hash?field?? 03??hmget?key?filed1....fieldN?//獲取全部指定的hash?filed?? 04??hmset?key?filed1?value1?...?filedN?valueN?//同時(shí)設(shè)置hash的多個(gè)field?? 05??hincrby?key?field?integer??//將指定的hash?filed?加上給定值?? 06??hexists?key?field??????????//測試指定field是否存在?? 07??hdel?key?field?????????????//刪除指定的hash?field?? 08??hlen?key???????????????????//返回指定hash的field數(shù)量?? 09??hkeys?key??????????????????//返回hash的所有field?? 10??hvals?key??????????????????//返回hash的所有value?? 11??hgetall????????????????????//返回hash的所有filed和value??
六、spring中整合redis 看了Java Clients,redis官網(wǎng)比較推薦Jedis,而spring對redis的客服端做了一個(gè)統(tǒng)一封裝,支持(Jedis,? JRedis, and RJC),這里對說下SPRING DATA - REDIS。
1、 使用maven的話那就很簡單了,直接加入依賴。
2、編輯pom.xml
[html] view plaincopy
< repository > ?????< id > spring-milestone</ id > ???? ?< name > Spring?Maven?MILESTONE?Repository</ name > ???? ?< url > http://maven.springframework.org/milestone</ url > ???? </ repository > ???????? < dependency > ?????< groupId > org.springframework.data</ groupId > ???? ?< artifactId > spring-data-redis</ artifactId > ???? ?< version > 1.0.0.RC1</ version > ???? </ dependency > ??
如果沒有使用maven,那直接下載jar包
http://s3.amazonaws.com/dist.springframework.org/release/DATAKV/spring-data-redis-1.0.0.RELEASE.zip
3、spring配置文件里添加
[html] view plaincopy
< bean ?id ="jedisConnectionFactory" ?class ="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" > ????????????< property ?name ="hostName" ?value ="localhost" /> ???? ????????< property ?name ="port" ?value ="6636" /> ???? </ bean > ???????? < bean ?id ="redisTemplate" ?class ="org.springframework.data.redis.core.RedisTemplate" > ????????????< property ?name ="connectionFactory" ?ref ="jedisConnectionFactory" /> ???? </ bean > ????
那就可以直接用redisTemplate,redisTemplate和HibernateTemplate很相似。
4、Java代碼
[html] view plaincopy
@Service???? public?class?RedisService?{???? ????@Resource???? ????private?RedisTemplate< Serializable ,?Serializable> ?template;???? ???? ?/**??? ?????*?向redis里面添加key-value格式的數(shù)據(jù)??? ?????*??? ?????*?@param?key???key??? ?????*?@param?value?value??? ?????*/???? ???? ????public?void?set(final?Serializable?key,?final?Serializable?value)?{???? ????????template.execute(new?RedisCallback< Object > ()?{???? ????????????@Override???? ????????????public?Object?doInRedis(RedisConnection?connection)?throws?DataAccessException?{???? ????????????????byte[]?key_ ?=?RedisUtil .getBytesFromObject(key);???? ????????????????byte[]?value_ ?=?RedisUtil .getBytesFromObject(value);???? ????????????????connection.set(key_,?value_);???? ????????????????return?true;???? ????????????}???? ????????});???? ????}???? ???? ?/**??? ?????*?根據(jù)key從redis里面取出value??? ?????*??? ?????*?@param?key???key??? ?????*/???? ?public?Serializable?get(final?Serializable?key)?{???? ????????return?template.execute(new?RedisCallback< Serializable > ()?{???? ????????????@Override???? ????????????public?Serializable?doInRedis(RedisConnection?connection)?throws?DataAccessException?{???? ???? ????????????????byte[]?keyBytes ?=?RedisUtil .getBytesFromObject(key);???? ????????????????byte[]?bytes ?=?connection .get(keyBytes);???? ????????????????return?(Serializable)?RedisUtil.getObjectFromBytes(bytes);???? ????????????}???? ????????});???? ????}???? }????
看了一點(diǎn)JedisConnectionFactory,之際上它只是對Jedis做了下簡單了封裝,再加上自己的連接池實(shí)現(xiàn)。
總結(jié)
以上是生活随笔 為你收集整理的redis缓存的安装和使用 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。