java基礎 一天學會 Redis

java基礎 一天學會 Redis


Redis 

 優點:高併發(10w+/s)的讀寫

 缺點受物理內存限制,所以不能簡單的用作大量數據的高性能讀寫
 說單點就是讀寫很頻繁的數據,但是容量不能超過物理內存的大小(目前一般好點的服務器內存有8G,16G,32G等),
 所以你保存的數據只能是幾個G的級別(單臺服務器),當然如果你的數量超過這個量可以考慮分佈式存儲,將數據分散地存儲在多臺Redis服務器上

下載安裝

redis 的下載地址:
官方下載地址:
https://redis.io/download
本教程使用的是redis-4.0.1版本,如果你在官方下載不到此版本,可去我的CSDN下載:
http://download.csdn.net/download/tan3739/9993951


這數據庫只有linux的,沒有windows 的,所以只能在linux上安裝使用了,安裝命令:
$ tar xzf redis-4.0.1.tar.gz
$ cd redis-4.0.1
$ make


編譯結束後,啓動數據庫服務:
$ src/redis-server 
下面是啓動好的窗口輸出,很酷的樣子:
4029:C 20 Sep 16:26:49.566 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4029:C 20 Sep 16:26:49.566 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=4029, just started
4029:C 20 Sep 16:26:49.566 # Warning: no config file specified, using the default config. In order to specify a config file use src/redis-server /path/to/redis.conf
4029:M 20 Sep 16:26:49.571 # Not listening to IPv6: unsupproted
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.1 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 4029
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               


4029:M 20 Sep 16:26:49.572 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
4029:M 20 Sep 16:26:49.572 # Server initialized
4029:M 20 Sep 16:26:49.572 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
4029:M 20 Sep 16:26:49.572 * Ready to accept connections


關閉數據庫服務:
$ shutdown
not connected> exit



啓動自帶的客戶端:
$ src/redis-cli
$ set foo bar
OK
$ get foo
"bar"
$ del foo
(integer) 1
能輸出"bar" 則說明已經安裝運行成功了


Key (鍵)
Key的命名 (官方建議採用形如:object-type:id:field)
不要太長,如超過1024字節的key本身就是一個不好的設計: 1是消耗大量的內存,2是在數據庫中查找這個的key計算成本很高
不要太短:如"u.1000.pwd" 不如"user:1000.password" 更易閱讀,增加的空間消耗可忽略不計
注意:Key 是大小寫敏感的


序號 命令 描述
1 DEL key 該命令用於在 key 存在時刪除 key。
2 DUMP key 序列化給定 key ,並返回被序列化的值。
3 EXISTS key 檢查給定 key 是否存在。
4 EXPIRE key seconds爲給定 key 設置過期時間。
5 EXPIREAT key timestamp EXPIREAT 的作用和 EXPIRE 類似,都用於爲 key 設置過期時間。 不同在於 EXPIREAT 命令接受的時間參數是 UNIX 時間戳(unix timestamp)。
6 PEXPIRE key milliseconds 設置 key 的過期時間以毫秒計。
7 PEXPIREAT key milliseconds-timestamp 設置 key 過期時間的時間戳(unix timestamp) 以毫秒計
8 KEYS pattern 查找所有符合給定模式( pattern)的 key 。
9 MOVE key db 將當前數據庫的 key 移動到給定的數據庫 db 當中。
10 PERSIST key 移除 key 的過期時間,key 將持久保持。
11 PTTL key 以毫秒爲單位返回 key 的剩餘的過期時間。
12 TTL key 以秒爲單位,返回給定 key 的剩餘生存時間(TTL, time to live)。
13 RANDOMKEY 從當前數據庫中隨機返回一個 key 。
14 RENAME key newkey 修改 key 的名稱
15 RENAMENX key newkey 僅當 newkey 不存在時,將 key 改名爲 newkey 。
16 TYPE key 返回 key 所儲存的值的類型。


DBSIZE # 當前數據庫的 key 數量
SELECT 1           # 切換到 1 號數據庫
FLUSHALL       # 清空所有數據庫的所有 key


Value的類型

(1) String

$ src/redis-cli
$ set mykey "Hello World"
OK
$ get mykey
"Hello World"


Redis 通常使用set命令來設置值,get命令來獲取值


字符串整型解析:
$ set counter 100
$ incr counter
(integer) 101
$ incr counter
(integer) 102
$ incrby counter 10
(integer) 112
$ decrby counter 10
(integer) 102


incr 是將值加1, decr是將值減少1
incrby 變量 增加偏移量




(2) list 鏈表

Radis 的 list 是基於鏈表實現的,而非數組。鏈表和數組的優缺點這裏就不說了,不懂的問百度
$ rpush messages "Hello how are you?"
(integer) 1
$ rpush message "Fine thanks. I'm having fun with Redis"
(integer) 2
$ rpush messages "Fine thanks. I'm having fun with Redis"
(integer) 3
$ rpush messages "I should look into this NOSQL thing ASAP"
(integer) 4
$ lrange messages 0 2
1) "Hello how are you?"
2) "Fine thanks. I'm having fun with Redis"
3) "Fine thanks. I'm having fun with Redis"


常用命令:
rpush: 尾部增加一條數據,返回鏈表大小
lpush: 頭部增加一條數據,返回鏈表大小
lrange: 取鏈表內容,-1可代表倒數第一條數據,-2代表倒數第2條,以此類推


序號 命令 描述
1 BLPOP key1 [key2 ] timeout 移出並獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。
2 BRPOP key1 [key2 ] timeout 移出並獲取列表的最後一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。
3 BRPOPLPUSH source destination timeout 從列表中彈出一個值,將彈出的元素插入到另外一個列表中並返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。
4 LINDEX key index 通過索引獲取列表中的元素
5 LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者後插入元素
6 LLEN key 獲取列表長度
7 LPOP key 移出並獲取列表的第一個元素
8 LPUSH key value1 [value2] 將一個或多個值插入到列表頭部
9 LPUSHX key value 將一個值插入到已存在的列表頭部
10 LRANGE key start stop 獲取列表指定範圍內的元素
11 LREM key count value 移除列表元素
12 LSET key index value 通過索引設置列表元素的值
13 LTRIM key start stop 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
14 RPOP key 移除並獲取列表最後一個元素
15 RPOPLPUSH source destination 移除列表的最後一個元素,並將該元素添加到另一個列表並返回
16 RPUSH key value1 [value2] 在列表中添加一個或多個值
17 RPUSHX key value 爲已存在的列表添加值


(3) set 集合

$ sadd myset 1
(integer) 1
$ sadd myset 2
(integer) 1
$ sadd myset 2
(integer) 0
$ sadd myset 2
(integer) 1
$ smembers myset
1) "1"
2) "2"
3) "3"
$ sismember myset 3
(integer) 1
$ sismember myset 35
(integer) 0


命令說明:
序號 命令 描述
1 SADD key member1 [member2] 向集合添加一個或多個成員
2 SCARD key 獲取集合的成員數
3 SDIFF key1 [key2] 返回給定所有集合的差集
4 SDIFFSTORE destination key1 [key2] 返回給定所有集合的差集並存儲在 destination 中
5 SINTER key1 [key2] 返回給定所有集合的交集
6 SINTERSTORE destination key1 [key2] 返回給定所有集合的交集並存儲在 destination 中
7 SISMEMBER key member 判斷 member 元素是否是集合 key 的成員
8 SMEMBERS key 返回集合中的所有成員
9 SMOVE source destination member 將 member 元素從 source 集合移動到 destination 集合
10 SPOP key 移除並返回集合中的一個隨機元素
11 SRANDMEMBER key [count] 返回集合中一個或多個隨機數
12 SREM key member1 [member2] 移除集合中一個或多個成員
13 SUNION key1 [key2] 返回所有給定集合的並集
14 SUNIONSTORE destination key1 [key2] 所有給定集合的並集存儲在 destination 集合中
15 SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素


(4) sorted set (有序集合)

有序集合的成員是唯一的,但分數(score)卻可以更改可以重複,如“新聞”的點擊量
$ ZADD newsclicked 100 funnyday
(integer) 1
$ ZADD newsclicked 1 ajoke
(integer) 1
$ ZREVRANGE newsclicked 0 -1 WITHSCORES
1) "funnyday"
2) "100"
3) "ajoke"
4) "1"


增加ajoke的點擊量:
$ ZINCRBY newsclicked 150 ajoke
"151"
$ ZINCRBY newsclicked 50 ajoke
"201"


再排序
$ ZREVRANGE newsclicked 0 -1 WITHSCORES
1) "ajoke"
2) "201"
3) "funnyday"
4) "100"


序號 命令及描述
1 ZADD key score1 member1 [score2 member2] 向有序集合添加一個或多個成員,或者更新已存在成員的分數
2 ZCARD key 獲取有序集合的成員數(size)
3 ZCOUNT key min max 計算在有序集合中指定區間分數的成員數
4 ZINCRBY key increment member 有序集合中對指定成員的分數加上增量 increment
5 ZINTERSTORE destination numkeys key [key ...]計算給定的一個或多個有序集的交集並將結果集存儲在新的有序集合 key 中
6 ZLEXCOUNT key min max 在有序集合中計算指定字典區間內成員數量
7 ZRANGE key start stop [WITHSCORES] 通過索引區間返回有序集合成指定區間內的成員
8 ZRANGEBYLEX key min max [LIMIT offset count]通過字典區間返回有序集合的成員
9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]通過分數返回有序集合指定區間內的成員
10 ZRANK key member 返回有序集合中指定成員的索引
11 ZREM key member [member ...] 移除有序集合中的一個或多個成員
12 ZREMRANGEBYLEX key min max 移除有序集合中給定的字典區間的所有成員
13 ZREMRANGEBYRANK key start stop 移除有序集合中給定的排名區間的所有成員
14 ZREMRANGEBYSCORE key min max 移除有序集合中給定的分數區間的所有成員
15 ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定區間內的成員,通過索引,分數從高到底
16 ZREVRANGEBYSCORE key max min [WITHSCORES]返回有序集中指定分數區間內的成員,分數從高到低排序
17 ZREVRANK key member 返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序
18 ZSCORE key member 返回有序集中,成員的分數值
19 ZUNIONSTORE destination numkeys key [key ...]計算給定的一個或多個有序集的並集,並存儲在新的 key 中
20 ZSCAN key cursor [MATCH pattern] [COUNT count]迭代有序集合中的元素(包括元素成員和元素分值)


(5) Hash(哈希)

$ HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
$ HGETALL runoobkey
1) "name"
2) "redis tutorial"
3) "description"
4) "redis basic commands for caching"
5) "likes"
6) "20"
7) "visitors"
8) "23000"


$ HGET runoobkey name
"redis tutorial"
$ HGET runoobkey description
"redis basic commands for caching"


序號 命令 描述
1 HDEL key field2 [field2] 刪除一個或多個哈希表字段
2 HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。
3 HGET key field 獲取存儲在哈希表中指定字段的值。
4 HGETALL key 獲取在哈希表中指定 key 的所有字段和值
5 HINCRBY key field increment 爲哈希表 key 中的指定字段的整數值加上增量 increment 。
6 HINCRBYFLOAT key field increment 爲哈希表 key 中的指定字段的浮點數值加上增量 increment 。
7 HKEYS key 獲取所有哈希表中的字段
8 HLEN key 獲取哈希表中字段的數量
9 HMGET key field1 [field2] 獲取所有給定字段的值
10 HMSET key field1 value1 [field2 value2 ] 同時將多個 field-value (域-值)對設置到哈希表 key 中。
11 HSET key field value 將哈希表 key 中的字段 field 的值設爲 value 。
12 HSETNX key field value 只有在字段 field 不存在時,設置哈希表字段的值。
13 HVALS key 獲取哈希表中所有值
14 HSCAN key cursor [MATCH pattern] [COUNT count]迭代哈希表中的鍵值對。





Redis 事務: 

1 MULTI  標記一個事務塊的開始。
2 DISCARD 取消事務,放棄執行事務塊內的所有命令。
3 EXEC  執行所有事務塊內的命令。


java 集成

java 開發客戶端下載(這裏只介紹jedis -- 原因是:開源,測試用例寫得很全,用的人多查資料方便):


導入依賴包:
commons-lang-2.5.jar
commons-pool2-2.4.2.jar
jedis-2.9.0.jar
包含上面3個jar 包的測試工程下載地址: http://download.csdn.net/download/tan3739/9994290
測試代碼:
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.10.66", 16325);// Redis 數據庫服務器的IP和端口
jedis.auth("12.1ekEJk234asdf1{}[]eu^&&$&#*($#kej:");// Redis 數據庫服務器的密碼

        System.out.println("服務正在運行: "+jedis.ping());
        
        jedis.set("site-list:100:title", "Try123456");
        String re = jedis.get("site-list:100:title");
        System.out.println("re:"+re);
        
        System.out.println("連接成功");
        
        jedis.close();
}




關於源碼:

 * Jedis 的源碼工程(導入 eclipse 可直接運行): http://download.csdn.net/download/tan3739/9994217
 * Jedis 的源碼下載(僅含源碼,手動導入jar包):http://download.csdn.net/download/tan3739/9993938
 * github 最新代碼庫: https://github.com/xetorthio/jedis
 * 源碼工程必看:
 * 基本測試: src\redis\clients\jedis\tests\JedisTest.java
 * 連接池測試: src\redis\clients\jedis\tests\JedisPoolTest.java
 * 其它常用命令測試: src\redis\clients\jedis\tests\commands



密碼

出於安全設置,Radis 默認只允許本機訪問,要允許其它客戶端也能訪問,需要註釋掉這一行: bind 127.0.0.1
$ vi redis.conf
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1


# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# bind 127.0.0.1


其次再設置操作密碼,注意客戶端不用密碼就能連接Redis,是操作的時候再檢查密碼,而Redis是可高併發訪問的(150k/s)
所以你的密碼必須設置得足夠複雜,以防被黑客破解。我下面設置的密碼爲:rek}j3jdiejdh&%^^*9039876A_+{U
$ vi redis.conf
requirepass rek}j3jdiejdh&%^^*9039876A_+{U


保存後重啓Redis


設置密碼後,客戶端連接 redis 服務就需要密碼驗證,否則無法執行命令。
輸入密碼的命令爲:
AUTH password
$ auth rek}j3jdiejdh&%^^*9039876A_+{U


java jedis連接設置密碼:
jedis.auth("rek}j3jdiejdh&%^^*9039876A_+{U");


持久化

語法:
save <seconds> <changes>
禁止持久化,註釋以下幾行:
#   save ""
# save 900 1
# save 300 10

# save 60 10000

這個查了一些資料,說 配置文件裏面配置的save 持久化 調用的是bgsave,但本人並未去測試驗證

只要禁止持久化,Redis 就是一臺 memcached  服務器

所以你只要學了Redis 就沒有什麼必要再去學 memcached。


小結:

Redis 雖然都是靠 key-value 鍵值對來存儲對象,但其內部還是有分類型的,
主要是靠命令來區分類型,如get,set都是String(當然也可以是任意可持久化的對象哦);lpush、lpop 則是鏈表,sadd 是集合,zadd、zincrby、zrevrange 是有序集合


參考網站:
http://www.runoob.com/redis/keys-move.html
http://blog.csdn.net/acmman/article/details/53301535
http://www.cnblogs.com/mushroom/p/4738170.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章