Redis常用命令小总
1. 寫在前面
這兩天在跟著伙伴學習做新聞推薦系統, 里面用到了數據庫的相關操作,又接觸到了mongodb和redis兩個新的數據庫,關于redis,這是一個高性能的key-value數據庫,非常適合海量數據庫的讀寫,常用類配合關系型數據庫做高速緩存的工作,之前在搭建大數據環境系列其實也裝過,但當時并沒有實戰的需求,所以裝完了就一直沒用, 也不會用, 正好這次做這個東西,有了實操的需求,所以想借著這個機會,整理下這次摸索中學習到的一些關于redis常用的命令,方便以后回查回看。 關于redis的原理, 我目前不懂, 如果后面有需求,也會整理噠, 這里只是整理下怎么用 ,而關于mongodb,這個后期也會整理下常用命令, 下面開始 😉
主要內容:
- 安裝與連接
- 庫相關操作
- 不同數據類型下的常用命令(string, hash, set, zset)
- Python操控Redis
OK,lets go!
2. 安裝與連接
之前也整理過一篇文章大數據開發環境搭建番外及總結:Redis和Anaconda環境的安裝搭建, 手動下載安裝包,解壓安裝的。
這里可以直接用sudo命令
# 安裝Redis服務器 sudo apt-get install redis-server# 查看redis服務器是否啟動 service redis-server status ps -aux|grep redis-server# 啟動Redis服務 redis-server [--daemonize yes][--port 6379] redis-server /etc/redis/redis.conf# 客戶端連接Redis redis-cli --raw[-h host -p port -a password]# 停止Redis 兩種方式 > redis-cli shutdown > kill redis-pid連接之后,正常的話是這樣的界面:
3. 庫相關操作
這里是整理與庫相關的操作, redis.conf配置中默認16個庫,下標從0~15。進入客服端默認選中第0個庫,可以通過select命令進行切換,index表示庫的小標。
# 切換庫命令 127.0.0.1:6379> select 1# 刪除當前庫的數據 127.0.0.1:6379[1]> flushdb# 刪除所有庫的數據 127.0.0.1:6379[1]> flushall# 查看key的數量 127.0.0.1:6379> dbsize關于key的常用操作:
# 查看所有key 127.0.0.1:6379> keys * 127.0.0.1:6379> keys *e # 還可以字符串匹配# 查找存在的key的數量 # 這個返回存在當前key的數量 # 作用: 我覺得一般會判斷某個key是否存在庫里面,如果大于0,說明存在key值 127.0.0.1:6379> exists key_name # 查看key的值對應的類型 # 返回key值的類型,有string, list, set, zset, hash和stream,如果不存在返回none # 作用:不同類型的值操作對應不同的操作命令,所以必須知道key的value類型才能進行后面的操作 127.0.0.1:6379> type key_name # 刪除key 127.0.0.1:6379> del key_name1[key_name2 key_name3 ....]4. 不同數據類型下常用命令
這里整理不同數值類型下的操作命令, 一個好的習慣就是選中一個庫之后, 先用keys*看看大體上都是什么樣的key, 然后用type 某個key查看對應的值是什么, 這樣方便后面的操作。
4.1 如果value類型是string
字符串是Redis最常見的數據列, 能夠存儲任何形式字符串, 包括二進制格式,JSON格式,序列化等數據。
常用命令:
# set key value 給key設置值 127.0.0.1:6379> set key_name jiang 127.0.0.1:6379> get key_name # 當然這里還可以一下設置多個 mset key value [key value, ...] mget key [key, ..]# append key_name new_value: 將指定的key追加值,類似于在原來的值上做字符串拼接 127.0.0.1:6379> append key_name jiang# incr key_name: 在原來值基礎上值加1, 前提是類型是數字,不是字符串 # decr key_name: 原來基礎上減1 # 這兩個的作用: 在那種需要自增或者自減的情況下非常有用,比如用戶點擊了喜歡文章, 統計文章被喜歡次數的時候# strlen key_name: 獲取key_name對應值的字符串長度 # setrange key_name offset value: 在offset開始,用value覆蓋key_name的字符串值 # getrange key_name start end: 獲取key_name對應字符串值的某個范圍4.2 如果value類型是list
如果key對應的value的類型是list列表, 那么常用命令:
# lpush key value [value ...] 左邊添加 # rpush key value [value ...] 右邊添加# lrange key start stop: 獲取指定范圍索引的元素# lindex key index: index位置的元素# llen: 列表長度# lrem key count value 刪除值為value的count個元素# lset key index value index位置的元素設置為value4.3 如果value類型是hash
hash類似于java中的HashMap,在Reids中做了更多的優化。此外hash是一個sytring類型的field和value的映射表,特別適合用于存儲對象。例如我們可以借用hash數據結構來存儲用戶信息,商品信息等。
常用命令:
# hset key_name filed value 哈希表中的field字段賦值value # hget key_name field 返回field對應的value # 同樣有hmset hmget 多個一起操作# hgetall key_name: 返回所有的field和值 # hdel key_name field[field...] 刪除指定的field# hexists key_name field 查看field是否存在 # hkeys: 所有的field # hvalues: 所有field的值4.4 如果value類型是set
如果value是set, 常用命令:
# sadd key_name member[member...] 添加元素到key_name下的集合中 # semebers key_name: 查看key_name下的集合的值 # sismember key member: 元素member是否在集合key_name中 # scard key_name: key_name集合長度 # srem key_name member[member..] 刪除元素值# srangemember key_name [count]: 隨機返回集合中的count個隨機元素 # spop key_name [count]: 刪除并返回一個或多個隨機元素 # sscan key_name 0 match patten: 瀏覽key_name的value, 對pattern進行匹配下面幾個集合之間的操作也挺常用
# sinter key_name1 key_name2... : 求集合交集 # sinterstore des_key key_name1 key_name2.. : 獲取key_name1和key_name2的交集存到des_key里面去# 把sinter換成sunion就是求集合并集了4.5 如果value類型是zset
如果value是zset, 這個很常用, 比較典型的一個場景是用戶的推薦列表, 需要是排好序的一個集合, 這個zset實際上是sorted set, 是會按照某個值排序的。常用命令:
# zadd key_name score member[score member...]: 將一個或多個member元素及score加入到有序集合key_name中, 這里會默認按照score排序, 如果member已經存在,就會更新score值 # zrange key start stop [withscores]: 這個是獲取某個范圍內的元素,可以帶score值 # zrevrange key start stop [withscores]: 和上面一樣,不過上面是從小到大排序,這里是score從大到小排序 # zrank key_name member: 從小到大排序之后獲取member在zset中的位置 # zrevrank key_name member: 從大到小排序之后,獲取member在zset中的位置# zrem key member[member...]: 刪除member # zcard key_name: 返回集合大小 # zscore key_name member: 獲取member的分數值# zrangebyscore key_name min max [withscores]: 返回score在[min, max]之間的member # zrevrangebyscore key_name min max # zremrangebyscore key_name min max: 刪除score在[min, max]之間的member # zrankbyscore key_name min_row max_row: 刪除行在[min_row, max_row]之間的member # zcount key_name min max: 統計score在[min, max]區間的元素個數# zincrby key_name value member: 對key_name里面的member元素的值增加value 這個也很常用下面集合的操作很常用:
zinterstore des_key number key_name1 key_name2 .. aggregate_method # 獲取key_name1 key_name2元素的交集存到des_key中, number表示合并的key的數量 zunionstore des_key number key_name1 key_name2 .. aggregate_method# 獲取key_name1 key_name2元素的并集存到des_key中# 聚合方式有max sum min, 如果有重復member的時候分數的處理方式這個并集操作蠻有用的, 比如完成zset的復制操作, 場景是每個用戶都有一個自己的推薦頁列表,那么就需要在總的hot_list里面, 給每個用戶單獨開一個hot_list, 就能用到這個操作, 代碼是:
# 復制hotlist一份到userid鍵中 zunionstore userid 1 hot_list當然, 真實操作的時候,是在python里面進行的操作,這時候要這么做:
import redisredis_db = redis.StrictRedis(host="127.0.0.1", port=6379, db=0, decode_responses=True) redis_db.zunionstore(des_key, ["sourc_key1", "source_key2"..])可以看到python基于redis模塊,進行操作還是非常方便的, 下面就來看下這個。
5. python操控redis
python中通過redis模塊操控redis, 安裝下
sudo pip3 install redis連接redis的兩種方式:
# 直連模式,適合長期連接場景 r = redis.Redis(host='127.0.0.1',port=6379,db=0,password='') redis_db = redis.StrictRedis(host="127.0.0.1", port=6379, db=0, decode_responses=True)# 連接池模式: 用ConnectPool管理redis server的所有連接, 實現連接池共享 pool = redis.ConnectionPool(host="127.0.0.1",port=6379,db=0,password="",decode_responses=True, max_connections=10) r1 = redis.Redis(connection_pool=pool) # 第一個客戶端訪問 r2 = redis.Redis(connection_pool=pool) # 第二個客戶端訪問基本操作的話,其實和上面非常類似, 只不過這里都換成了函數式操作。 針對不同的類型,簡單的整理幾個:
pool = redis.ConnectionPool(host="127.0.0.1", port=6379, db=0, password="", decode_responses=True, max_connections=10) r = redis.StrictRedis(connection_pool=pool)string操作:
r.set('name', 'wuzhong') r.append('name', 'qiang') # name: wuzhongqiangr.mset({'age': '26', 'home': 'shandong'}) r.mget('name', 'age', 'home') # ['wuzhognqiang', '26', 'shandong']r.incrby('age', 5) r.get('age) # 26+5 r.incrbyfloat('age', 5.2) r.delete('name')hash操作
r.hset('user1', 'name', 'zhangsan') r.hset('user1', 'age', '22') r.hincrbyfloat('user1', 'age', 0.5)# 一次性設置多個field和value user_dict = {'password':'123','gender':'M','home':'遼寧' } r.hmset('user1',user_dict) # 在user1對應的hash中批量設置鍵值對 r.hlen('user1') # 鍵的個數 r.hgetall('user1') # 獲取所有鍵值對 r.hkeys('user1') # map的鍵 r.hvals('user1') # map的值 hexists('user1', 'home') # 是否有home這個鍵list操作
r.lpush('database','sql','mysql','redis') r.lset('database', 0, 'redisdb') # 對database對應的list中的某一個索引位置重新賦值set操作
r.sadd("name","zhangsan") # 給name對應的集合中添加元素 r.sadd("name","zhangsan","lisi","wangwu")# zset操作 mapping = {'zhangsan':85,'lisi':92, 'wangwu':76 } r.zadd('C++',mapping,nx=True) # 在C++對應的有序集合中添加元素 r.zrange('C++',0,-1,withscores=True) r.zcard("C++") r.zcount('C++',min=0,max=90) r.zincrby(name='C++',value='lisi',amount=3) r.zrangebyscore('C++',70,90) r.zrank('C++','lisi')mapping = {'xuliu':74,'lisi':82, 'wangwu':87 } r.zadd('python',mapping,nx=True) r.zinterstore('sum_score_i',['C++','python'],aggregate='sum')r.zunionstore('sum_score_u',['C++','python'],'min') r.zrem('C++', 'zhangsan') r.zremrangebyscore('C++', min=80, max=100) r.zremrangebyrank('python', min=1, max=3)最后在介紹個管道的操作, Redis 模塊默認在執行每次請求都會向連接池請求創建連接和斷開申請操作,如果想要在一次請求中指定多個命令,則可以使用pipline實現一次請求指定多個命令,并且默認情況下一次pipline 是原子性操作(即為一次操作)。
pipe = r.pipeline(transaction=True)pipe.set('name', 'jiangyou') pipe.set('age', 'age') pipe.execute()print(r.mget("name","age")) # ['jiangyou', 'age']參考:
- Python 操作redis有序集合(sorted set)
- Redis基礎
總結
以上是生活随笔為你收集整理的Redis常用命令小总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NDK at ...Android\Sd
- 下一篇: 金山毒霸技术预览版1.0 beta【云沙