《那些年我們一起錯過redis》要點:
本文介紹了那些年我們一起錯過redis,希望對您有用。如果有疑問,可以聯(lián)系我們。
1jedis介紹
Redis不僅是使用命令來操作,現(xiàn)在基本上主流的語言都有客戶端支持,比如java、C、C#、C++、php、Node.js、Go等.
在官方網站里列一些Java的客戶端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推薦使用Jedis和Redisson. 在企業(yè)中用的最多的就是Jedis.
Jedis同樣也是托管在github上,地址:https://github.com/xetorthio/jedis
1.1工程搭建
首先搭建一個工程項目測試一下,添加jar包
單實例連接redis
使用jedis連接池連接redis服務器
1.1 Spring整合jedisPool
?添加spring的jar包
?配置spring配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 連接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大連接數(shù) -->
<property name="maxTotal" value="30" />
<!-- 最大空閑連接數(shù) -->
<property name="maxIdle" value="10" />
<!-- 每次釋放連接的最大數(shù)目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 釋放連接的掃描間隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- 連接最小空閑時間 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!-- 連接空閑多久后釋放, 當空閑時間>該值 且 空閑連接>最大空閑連接數(shù) 時直接釋放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000" />
<!-- 獲取連接時的最大等待毫秒數(shù),小于零:阻塞不確定的時間,默認-1 -->
<property name="maxWaitMillis" value="1500" />
<!-- 在獲取連接的時候檢查有效性, 默認false -->
<property name="testOnBorrow" value="false" />
<!-- 在空閑時檢查有效性, 默認false -->
<property name="testWhileIdle" value="true" />
<!-- 連接耗盡時是否阻塞, false報異常,ture阻塞直到超時, 默認true -->
<property name="blockWhenExhausted" value="false" />
</bean>
<!-- redis單機 通過連接池 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool"
destroy-method="close">
<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
<constructor-arg name="host" value="192.168.242.130" />
<constructor-arg name="port" value="6379" />
</bean>
</beans>
@Test
public void testJedisPool() {
JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
Jedis jedis = null;
try {
jedis = pool.getResource();
jedis.set("name", "lisi");
String name = jedis.get("name");
System.out.println(name);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (jedis != null) {
// 關閉連接
jedis.close();
}
}
}
1.2 Redis數(shù)據(jù)類型
1.2.1String
1.2.1.1命令
1.2.1.1.1賦值
語法:SET key value
127.0.0.1:6379> set test 123
OK
1.2.1.1.2取值
語法:GET key
127.0.0.1:6379> get test
"123“
1.2.1.1.3取值并賦值
語法:GETSET key value
127.0.0.1:6379> getset s2 222
"111"
127.0.0.1:6379> get s2
"222"
1.2.1.1.4設置/獲取多個鍵值
語法:
MSET key value [key value …]
MGET key [key …]
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> mget k1 k3
1) "v1"
2) "v3"
1.2.1.1.5刪除
語法:DEL key
127.0.0.1:6379> del test
(integer) 1
1.2.1.1.6數(shù)值增減
n遞增數(shù)字
當存儲的字符串是整數(shù)時,Redis提供了一個實用的命令INCR,其作用是讓當前鍵值遞增,并返回遞增后的值.
語法:INCR key
127.0.0.1:6379> incr num
(integer) 1
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> incr num
(integer) 3
n增加指定的整數(shù)
語法:INCRBY key increment
127.0.0.1:6379> incrby num 2
(integer) 5
127.0.0.1:6379> incrby num 2
(integer) 7
127.0.0.1:6379> incrby num 2
(integer) 9
n遞減數(shù)值
語法:DECR key
127.0.0.1:6379> decr num
(integer) 9
127.0.0.1:6379> decr num
(integer) 8
n減少指定的整數(shù)
語法:DECRBY key decrement
127.0.0.1:6379> decr num
(integer) 6
127.0.0.1:6379> decr num
(integer) 5
127.0.0.1:6379> decrby num 3
(integer) 2
127.0.0.1:6379> decrby num 3
(integer) -1
1.2.1.1.7向尾部追加值
APPEND的作用是向鍵值的末尾追加value.如果鍵不存在則將該鍵的值設置為value,即相當于 SET key value.返回值是追加后字符串的總長度.
語法:APPEND key value
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> append str " world!"
(integer) 12
127.0.0.1:6379> get str
"hello world!"
1.2.1.1.8 獲取字符串長度
STRLEN命令返回鍵值的長度,如果鍵不存在則返回0.
語法:STRLEN key
127.0.0.1:6379> strlen str
(integer) 0
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> strlen str
(integer) 5
做個簡單的小應用>>自增主鍵
商品編號、訂單號采用string的遞增數(shù)字特性生成.
定義商品編號key:items:id
192.168.101.3:7003> INCR items:id
(integer) 2
192.168.101.3:7003> INCR items:id
(integer) 3
2 Hash
散列類型
2.1使用string的問題
假設有User對象以JSON序列化的形式存儲到Redis中,User對象有id,username、password、age、name等屬性,存儲的過程如下:
保存、更新:
User對象 à json(string) à redis
如果在業(yè)務上只是更新age屬性,其他的屬性并不做更新我應該怎么做呢? 如果仍然采用上邊的方法在傳輸、處理時會造成資源浪費,下邊講的hash可以很好的解決這個問題.
2.1.2redis hash介紹
hash叫散列類型,它提供了字段和字段值的映射.字段值只能是字符串類型,不支持散列類型、集合類型等其它類型.如下:
2.1.3命令
2.1.3.1賦值
HSET命令不區(qū)分插入和更新操作,當執(zhí)行插入操作時HSET命令返回1,當執(zhí)行更新操作時返回0.
?一次只能設置一個字段值
語法:HSET key field value
127.0.0.1:6379> hset user username zhangsan
(integer) 1
?一次可以設置多個字段值
語法:HMSET key field value [field value ...]
127.0.0.1:6379> hmset user age 20 username lisi
OK
?當字段不存在時賦值,類似HSET,區(qū)別在于如果字段存在,該命令不執(zhí)行任何操作
語法:HSETNX key field value
127.0.0.1:6379> hsetnx user age 30 如果user中沒有age字段則設置age值為30,否則不做任何操作
(integer) 0
2.1.3.2取值
?一次只能獲取一個字段值
語法:HGET key field
127.0.0.1:6379> hget user username
"zhangsan“
?一次可以獲取多個字段值
語法:HMGET key field [field ...]
127.0.0.1:6379> hmget user age username
1) "20"
2) "lisi"
?獲取所有字段值
語法:HGETALL key
127.0.0.1:6379> hgetall user
1) "age"
2) "20"
3) "username"
4) "lisi"
2.1.3.3刪除字段
可以刪除一個或多個字段,返回值是被刪除的字段個數(shù)
語法:HDEL key field [field ...]
127.0.0.1:6379> hdel user age
(integer) 1
127.0.0.1:6379> hdel user age name
(integer) 0
127.0.0.1:6379> hdel user age username
(integer) 1
2.1.3.4增加數(shù)字
語法:HINCRBY key field increment
127.0.0.1:6379> hincrby user age 2 將用戶的年齡加2
(integer) 22
127.0.0.1:6379> hget user age 獲取用戶的年齡
"22“
2.1.3.4.1判斷字段是否存在
語法:HEXISTS key field
127.0.0.1:6379> hexists user age 查看user中是否有age字段
(integer) 1
127.0.0.1:6379> hexists user name 查看user中是否有name字段
(integer) 0
2.1.3.4.2只獲取字段名或字段值
語法:
HKEYS key
HVALS key
127.0.0.1:6379> hmset user age 20 name lisi
OK
127.0.0.1:6379> hkeys user
1) "age"
2) "name"
127.0.0.1:6379> hvals user
1) "20"
2) "lisi"
2.1.3.4.3獲取字段數(shù)量
語法:HLEN key
127.0.0.1:6379> hlen user
(integer) 2
3.1List
3.1.1Arraylist和linkedlist的區(qū)別
Arraylist是使用數(shù)組來存儲數(shù)據(jù),特點:查詢快、增刪慢
Linkedlist是使用雙向鏈表存儲數(shù)據(jù),特點:增刪快、查詢慢,但是查詢鏈表兩端的數(shù)據(jù)也很快.
Redis的list是采用來鏈表來存儲的,所以對于redis的list數(shù)據(jù)類型的操作,是操作list的兩端數(shù)據(jù)來操作的.
3.1.2命令
3.1.2.1向列表兩端增加元素
?向列表左邊增加元素
語法:LPUSH key value [value ...]
127.0.0.1:6379> lpush list:1 1 2 3
(integer) 3
?向列表右邊增加元素
語法:RPUSH key value [value ...]
127.0.0.1:6379> rpush list:1 4 5 6
(integer) 3
3.1.2.2查看列表
LRANGE命令是列表類型最常用的命令之一,獲取列表中的某一片段,將返回start、stop之間的所有元素(包含兩端的元素),索引從0開始.索引可以是負數(shù),如:“-1”代表最后邊的一個元素.
語法:LRANGE key start stop
127.0.0.1:6379> lrange list:1 0 2
1) "2"
2) "1"
3) "4"
127.0.0.1:6379> lrange list1 0 -1
3.1.2.3從列表兩端彈出元素
LPOP命令從列表左邊彈出一個元素,會分兩步完成:
第一步是將列表左邊的元素從列表中移除
第二步是返回被移除的元素值.
語法:
LPOP key
RPOP key
127.0.0.1:6379> lpop list:1
"3“
127.0.0.1:6379> rpop list:1
"6“
3.1.2.4獲取列表中元素的個數(shù)
語法:LLEN key
127.0.0.1:6379> llen list:1
(integer) 2
3.1.2.5刪除列表中指定的值
LREM命令會刪除列表中前count個值為value的元素,返回實際刪除的元素個數(shù).根據(jù)count值的不同,該命令的執(zhí)行方式會有所不同:
l當count>0時, LREM會從列表左邊開始刪除.
l當count<0時, LREM會從列表后邊開始刪除.
l當count=0時, LREM刪除所有值為value的元素.
語法:LREM key count value
3.1.2.6 獲得/設置指定索引的元素值
?獲得指定索引的元素值
語法:LINDEX key index
127.0.0.1:6379> lindex l:list 2
"1"
?設置指定索引的元素值
語法:LSET key index value
127.0.0.1:6379> lset l:list 2 2
OK
127.0.0.1:6379> lrange l:list 0 -1
1) "6"
2) "5"
3) "2"
4) "2"
3.1.2.7 只保留列表指定片段
指定范圍和LRANGE一致
語法:LTRIM key start stop
127.0.0.1:6379> lrange l:list 0 -1
1) "6"
2) "5"
3) "0"
4) "2"
127.0.0.1:6379> ltrim l:list 0 2
OK
127.0.0.1:6379> lrange l:list 0 -1
1) "6"
2) "5"
3) "0"
3.1.2.8 向列表中插入元素
該命令首先會在列表中從左到右查找值為pivot的元素,然后根據(jù)第二個參數(shù)是BEFORE還是AFTER來決定將value插入到該元素的前面還是后面.
語法:LINSERT key BEFORE|AFTER pivot value
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> linsert list after 3 4
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "4"
3) "2"
4) "1"
3.1.2.9 將元素從一個列表轉移到另一個列表中
語法:RPOPLPUSH source destination
127.0.0.1:6379> rpoplpush list newlist
"1"
127.0.0.1:6379> lrange newlist 0 -1
1) "1"
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "4"
3) "2"
歡迎參與《那些年我們一起錯過redis》討論,分享您的想法,維易PHP學院為您提供專業(yè)教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/9229.html