Redis學習
- 楔子
- 1 Redis快速入門
- 2 數據類型以及操作
- 2.2 string類型以及操作
- 2.2.1 set
- 2.2.2 setnx
- 2.2.3 setex|設置鍵值有效期
- 2.2.4 setrange|設置key的value值得子字符串
- 2.2.5 mset
- 2.2.6 msetnx
- 2.2.7 get
- 2.2.8 getset|設置key的值,並返回key的舊值
- 2.2.9 getrange|獲取指定key的value值得子字符串
- 2.2.10 mget
- 2.2.11 incr|incrby
- 2.2.12 decr |decrby
- 2.2.13 append 給指定key的字符串追加value,返回新字符串值得長度
- 2.3 hashes類型和操作
- 2.3.1 hset|hsetnx(如果字段存在返回0)
- 2.3.2 hmset|同時設置多個field
- 2.3.3 hget|獲取指定的hash field
- 2.3.5 hmget|獲取全部指定的hash field
- 2.3.6 hincrby
- 2.3.7 hexists
- 2.3.8 hlen
- 2.3.9 hkeys |返回hash的所有field|hvals 返回所有value
- 2.3.10 hgetall|獲取某個hash全部的key value
- 2.4 list類型及操作
- 2.4.1 lpush|頭部添加元素
- 2.4.2 rpush|尾部添加元素
- 2.4.3 linsert|在特定位置之前或之後插入字符串元素
- 2.4.4 lset|設置list中指定下標的元素值
- 2.4.5 lrem
- 2.4.6 ltrim
- 2.4.7 lpop|rpop從頭部(尾部)刪除並返回
- 2.4.8 llen|獲取list的長度
- 2.5 set類型以及操作
- 3 Redis常用命令
- 3.1 鍵值相關命令
- 3.1.1 keys
- 3.1.2 exists|確定一個key是否存在
- 3.1.3 del
- 3.1.4 expire|設置一個key的過期時間
- 3.1.5 move
- 3.1.6 rename
- 3.1.7 type 返回值得類型
- 3.2 服務器相關命令
- Redis 啓動停止
- Redis生產環境配置
- 其他資料
- Redis key設計
楔子
redis學習筆記。
1 Redis快速入門
Redis是一個Key-value存儲系統,和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)和zset(有序集合).這些數據類型都支持push/pop、add/remove及取交集並集和差集以及更豐富的操作,而且這些操作都是原子性的,再次基礎上,redis支持不同方式的排序,與memacched一樣,爲了保證效率,數據都是緩存在內存中,區別是redis會週期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
1.3.1 數據類型
作爲key-value類型數據庫,Redis也提供了鍵和鍵值(value)的映射關係,但是除了常規的數值或字符串,Redis的鍵值還可以是以下形式。
- List 列表
- Sets 集合
- Sorted sets 有序集合
- Hashes 哈希表
鍵值的數據類型決定了該鍵值支持的操作。Redis支持諸如列表、集合和有序集合的交集、並集、差集等高級原子操作,同時,如果鍵值的類型是普通數字,Redis則提供了自增等原子操作。
1.3.6 適用場合
1 取最新N個數據的操作
2 排行榜應用,取top N操作
這是以某個條件爲權重,比如按次數排序,可以使用sorted set,將要排序的值設置成sorted set的score,將具體的數據設置成value, 只需執行一次ZADD即可
3 需要精準設定過期的時間的應用
4 計數器應用
Redis的命令都是原子性的,可以使用incr decr命令來構建計數器系統。
5 uniq操作
使用Redis的set數據結構最合適了,只需要不斷地將數據往set中扔就行了。set會自動排重。
2 數據類型以及操作
2.2 string類型以及操作
string類型是二進制安全的。可以包含任何數據,比如JPG圖片或者序列化的對象。從nebula實現來看strin可以看做byte數組,最大上限1G字節。
2.2.1 set
27.0.0.1:6379> set name CN
OK
127.0.0.1:6379>
2.2.2 setnx
如果之前的key有一個值,本次修改不生效
127.0.0.1:6379> setnx name dou
(integer) 0
2.2.3 setex|設置鍵值有效期
設置鍵值對的有效期
設置 key:value 有效期爲10秒
127.0.0.1:6379> setex key 10 value
OK
127.0.0.1:6379> get key
"value"
2.2.4 setrange|設置key的value值得子字符串
127.0.0.1:6379> set mail [email protected]
OK
127.0.0.1:6379> setrange mail 3 qq.com
(integer) 10
127.0.0.1:6379> get mail
"[email protected]"
2.2.5 mset
一次設置多個key的值,成功返回OK表示所有值都設置了,失敗返回0表示沒有任何值被設置。
127.0.0.1:6379> mset name1 v1 name2 v2 namee3 v3
OK
2.2.6 msetnx
與上述相同,但不會覆蓋已存在的key,如果返回0表示操作都會回滾,都不被執行。
2.2.7 get
2.2.8 getset|設置key的值,並返回key的舊值
127.0.0.1:6379> get name
"v1"
127.0.0.1:6379> getset name v2
"v1"
127.0.0.1:6379> get name
"v2"
127.0.0.1:6379>
2.2.9 getrange|獲取指定key的value值得子字符串
127.0.0.1:6379> get mail
"[email protected]"
127.0.0.1:6379> getrange mail 0 3
"my@q"
#字符串下標是從0開始的
127.0.0.1:6379> getrange mail -5 -1
".comm"
#當下標超出字符串長度時,默認行爲是同方向的最大下標
127.0.0.1:6379> getrange mail 3 100
"qq.comm"
127.0.0.1:6379>
2.2.10 mget
一次獲取多個key的值,如果key不存在,返回nil
2.2.11 incr|incrby
對key的值做加加操作,如果int的值不是value會返回錯誤。
2.2.12 decr |decrby
2.2.13 append 給指定key的字符串追加value,返回新字符串值得長度
2.3 hashes類型和操作
Redis hash是一個string類型的field和value的映射表,它的添加、刪除操作都是O(1)平均。
hash特別適合用於存儲對象。相對於將對象的每個字段存成單個string類型,將一個對象存儲在hash類型中會佔用更少的內存,並且可以更方便的存取整個對象。省內存的原因是新建一個hash對象時開始使用zipmap來存儲,
2.3.1 hset|hsetnx(如果字段存在返回0)
127.0.0.1:6379> hset myhash field1 hello
(integer) 1
2.3.2 hmset|同時設置多個field
127.0.0.1:6379> hmset myhash f1 v1 f2 v3
2.3.3 hget|獲取指定的hash field
2.3.5 hmget|獲取全部指定的hash field
2.3.6 hincrby
指定的hash field加上給定值
127.0.0.1:6379> hset myhash age 20
(integer) 1
127.0.0.1:6379> hget myhash age
"20"
127.0.0.1:6379> hincrby myhash age 8
(integer) 28
127.0.0.1:6379> hget myhash age
"28"
2.3.7 hexists
測試指定field是否存在
127.0.0.1:6379> hexists myhash name
(integer) 0
127.0.0.1:6379> hexists myhash age
(integer) 1
返回1 表示存在
2.3.8 hlen
返回指定hash的field數量
2.3.9 hkeys |返回hash的所有field|hvals 返回所有value
2.3.10 hgetall|獲取某個hash全部的key value
2.4 list類型及操作
list是鏈表結構,主要功能是push pop獲取一個範圍的所有值等,操作中key理解爲鏈表的名字。
Redis的list類型其實就是每一個子元素都是string類型的雙向鏈表。鏈表的最大長度是(2的32次方)。可以通過push pop操作鏈表的頭部或尾部添加刪除元素。使得list即可用作棧,也有用作隊列。
2.4.1 lpush|頭部添加元素
在key對應的list開頭添加字符串元素
127.0.0.1:6379> lpush mylist world hello rdis
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "rdis"
2) "hello"
3) "world"
127.0.0.1:6379>
2.4.2 rpush|尾部添加元素
127.0.0.1:6379> rpush mylist go
2.4.3 linsert|在特定位置之前或之後插入字符串元素
127.0.0.1:6379> lrange mylist 0 -1
1) "rdis"
2) "hello"
3) "world"
4) "go"
5) "hello"
127.0.0.1:6379> linsert mylist before hello there
(integer) 6
127.0.0.1:6379> lrange mylist 0 -1
1) "rdis"
2) "there"
3) "hello"
4) "world"
5) "go"
6) "hello"
127.0.0.1:6379>
2.4.4 lset|設置list中指定下標的元素值
127.0.0.1:6379> lrange mylist2 0 -1
1) "one"
2) "tow"
3) "three"
4) "four"
127.0.0.1:6379> lset mylist2 0 go
OK
127.0.0.1:6379> lset mylist2 -2 goland
OK
127.0.0.1:6379> lrange mylist2 0 -1
1) "go"
2) "tow"
3) "goland"
4) "four"
127.0.0.1:6379>
2.4.5 lrem
從list中刪除count個和value相同的元素
127.0.0.1:6379> lrange myl5 0 -1
1) "hello"
2) "hello"
3) "hello"
4) "hello"
5) "hello"
127.0.0.1:6379> lrem myl5 4 hello
(integer) 4
127.0.0.1:6379> lrange myl5 0 -1
1) "hello"
127.0.0.1:6379>
如果count=0 全部刪除,小於0按從尾到頭的順序刪除
2.4.6 ltrim
保留指定key的值範圍內的數據
2.4.7 lpop|rpop從頭部(尾部)刪除並返回
2.4.8 llen|獲取list的長度
2.5 set類型以及操作
set是集合,對集合的操作有刪除添加,對多個集合求交併差等操作。
通過集合的並集 交集 差集 可以實現好友推薦和blog的tag功能。
2.5.1 sadd
127.0.0.1:6379> sadd myset hello
(integer) 1
127.0.0.1:6379> sadd myset world
(integer) 1
127.0.0.1:6379> sadd myset world
(integer) 0
127.0.0.1:6379> smembers myset
1) "hello"
2) "world"
127.0.0.1:6379>
2.5.2 srem|刪除名稱爲key的set中的元素member
127.0.0.1:6379> srem myset hello
(integer) 1
#沒有元素是 返回0
127.0.0.1:6379> srem myset hello
(integer) 0
2.5.3 spop|隨機刪除並返回其中一個元素
2.5.4 sdiff|返回給定key與第一個key的差集
3 Redis常用命令
3.1 鍵值相關命令
3.1.1 keys
#返回所有key
keys *
#返回所有mylist開頭的key
keys mylist*
3.1.2 exists|確定一個key是否存在
3.1.3 del
3.1.4 expire|設置一個key的過期時間
3.1.5 move
將key移動到指定數據庫
3.1.6 rename
重命名key
3.1.7 type 返回值得類型
3.2 服務器相關命令
3.2.1 ping|測試連接是否存活
3.2.2 echo|在命令行打印一些內容
3.2.3 quit|退出連接
3.2.4 dbsize 返回當前數據庫中key的數目
3.2.5 info|獲取服務器相關信息和統計
3.2.6 config get|獲取服務器配置信息
127.0.0.1:6379[2]> config get dir
1) "dir"
2) "/var/lib/redis"
127.0.0.1:6379[2]>
3.2.7 flushdb刪除當前選擇數據庫中的所有key
3.2.8 flushall 刪除所有數據庫中的所有key
Redis 啓動停止
## 啓動redis-server,後臺線程
$ redis-server /usr/local/redis/etc/redis.conf
## 啓動成功
$ ps axu|grep redis
shoren 14948 0.0 0.0 2434840 760 s000 S+ 10:18上午 0:00.00 grep redis
shoren 14946 0.0 0.0 2452968 1492 ?? Ss 10:18上午 0:00.01 redis-server *:6379
## 關閉服務器
$ redis-cli shutdown
##關閉成功
$ ps axu|grep redis
shoren 14952 0.0 0.0 2435864 772 s000 S+ 10:19上午 0:00.01 grep redis
Redis生產環境配置
https://blog.csdn.net/min996358312/article/details/59247721
https://www.jianshu.com/p/8ce453340828
其他資料
Redis key設計
https://blog.csdn.net/babykakaluo/article/details/9822381