redis - 基础
redis簡介
- Redis 是一個開源的,基于內存的NoSql數據庫。 它支持多種數據結構 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets), bitmaps, hyperloglogs 和 地理空間(geospatial)。 Redis 內置了 復制,LUA腳本和磁盤持久化, 并通過 Redis哨兵(Sentinel)和集群(Cluster)保證了高可用。
- 特點:快!讀寫性能可達到10萬/秒,這得益于所有數據都是存在內存中,而且采用單線程架構避免了線程之間切換和競爭帶來的問題,并且采用了epoll來實現IO多路復用。
使用場景簡單總結
redis的安裝使用
第一步:redis的源碼包上傳到linux,或者直接下載 wget http://download.redis.io/releases/redis-3.0.7.tar.gz,具體版本列表查看http://download.redis.io/releases
第二步:tar xzf redis-3.0.7.tar.gz
第三步:ln -s redis-3.0.7.tar.gz redis 建立了一個軟鏈接,不把redis目錄固定在指定版本上,有利于未來升級。非必要
第四步:cd redis
第五步:make
第六步:make install 默認安裝到/usr/local/bin,可以在任意目錄下執行redis命令,也可以指定安裝配置make install PREFIX=/usr/local/redis。一般軟件安裝到/usr目錄下
另外docker安裝更加方便docker run -p 6379:6379 --name redis -v /usr/local/docker/redis.conf:/etc/redis/redis.conf -v /usr/local/docker/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
遠程連接其他主機的redis遠程連接其他主機的redis
vim redis.conf
注釋以下綁定的主機地址#bind 127.0.0.1 或者bind 0.0.0.0
修改protected-mode no 或者config set requirepass 123 ->123是密碼
防火墻通過6379端口 iptables -I INPUT -p tcp --dport 6379 -j ACCEPT
后臺啟動
vim redis.conf
daemon yes
./redis-server …/redis.conf (可以特殊指定redis.conf)
連接redis
./redis-cli -h 192.168.0.1 -p 6379
注冊為windows服務
常用redis命令
keys命令
dbsize返回當前數據庫的key數量。時間復雜度是O(1),不用擔心阻塞問題
keys 返回當前數據庫指定正則匹配的key,因可能會阻塞較長時間生產環境禁用,推薦scan
scan 它們每次執行都只會返回部分元素(默認10個),不會出現像 KEYS 或者 SMEMBERS 命令帶來的可能會阻塞服務器的問題。對應集合遍歷內部元素的有hcan、sscan、zscan。
exists
rename 重命名。如果newkey已經存在,則值將被覆蓋.可使用renamenx
randomkey 隨機返回一個鍵
del 批量刪除key 。 如某些key不存在,則直接忽略
expire 設置key的過期時間 。過期時間為負值會立即被刪除。返回 -1沒有設置過期時間,-2鍵不存在。list,hash不支持集合內部元素的過期功能
persist 將key設置為永久的
ttl 返回key的剩余過期時間
type 存儲的數據結構類型,即string,hash, list, set和zset的類型
object encoding返回內部的實際編碼格式,如string結構類型其實內部對應著int embstr raw 三種編碼格式
遷移鍵可以使用move,dump+restore, migrate。推薦使用migrate,原子性操作,支持多個鍵,只需要在源redis上操作即可,簡單方便。
string類型
| set | 設置key value 如果已存在key 會覆蓋(包括過期時間) | EX – 設置鍵key的過期時間,單位秒 PX – 設置鍵key的過期時間,單位毫秒 NX – 只有鍵key不存在的時才會設置key的值 XX – 只有鍵key存在的時才會設置key的值 SET命令加上選項已經可以完全取代SETNX, SETEX, PSETEX |
| setrange | 從指定的offset處開始,覆蓋value的一部分 | 和getrange對應 |
| setex | SETEX key seconds value 設置過期時間 | 可以被set代替; psetex是以毫秒為單位 |
| setnx | SET if Not eXists的簡寫 當key不存在時才設置 | 可以被set代替 |
| mset | 批量設置key value | msetnx批量設置,是原子的,如果有一個key存在全部失敗 |
| getset | 設置key value并返回原來key對應的value | 和INCR一起使用可實現重置的計數功能 |
| append | 追加value值 | |
| get | 返回string類型的value | |
| mget | 批量返回key的值 | |
| getrange | 返回value中指定的子串 | |
| strlen | 返回key的string類型value的長度 | |
| incr | 將整數型的value值加1 | incrby 指定增加的值,可為負數 |
| decr | 將整數型的value值減1 | decrby 指定減少的值,可為負數 |
緩存,降低數據庫壓力:
存儲如共享session,JWTtoken等;校驗用戶獲取驗證碼次數或者一天內登陸失敗次數等等,利用注解+AOP來攔截實現
3. hash類型
將key值進行分類管理,并且大多情況下占用內存更少
| hset | hset myhash:001 name xiaoming | |
| hmset | 批量設置指定key哈希集中指定的字段 | |
| hsetnx | 只在 key 指定的哈希集中不存在指定的字段時,設置字段的值 | |
| hdel | 從 key 指定的哈希集中移除指定的域 | |
| hexists | 返回hash里面field是否存在 | |
| hget | ||
| hmget | 批量返回指定key哈希集中指定的字段 | |
| hgetall | 返回指定key哈希集中所有的字段和值 | hkeys 返回所有字段;hvals返回所有字段對應的值 |
| hlens | 返回 key 指定的哈希集包含的字段的數量 | |
| hincrby |
list列表
set集合
是string類型的無序集合,可以對集合求交集sinter,并集sunion,差集sdiff,可應用于好友推薦,tag標簽查詢等場景。
標簽的簡單示例:
給用戶添加標簽sadd user:1:tags tag1 tag2 tag3 , sadd user:2:tags tag1 tag2 tag3
給標簽添加用戶sadd tag1:users user:1 user:2, sadd tag2:users user:1 user:2
注意上面要放在一個事務中執行,可利用lua腳本
獲取兩個用戶共有的標簽 sinter user:1:tags user:2:tags
zset有序集合
排行榜系統
連接和服務器配置常用命令
| auth | auth password 驗證密碼登錄 | |
| ping | 測試連接,成功返回pang | |
| select | 選擇數據庫 | |
| config get | 讀取redis服務器的配置文件參數 | * 可讀取所有支持的配置參數 也可參看單獨某個參數,如config get requirepass查看密碼 (感覺這樣很不安全) |
| config set | 設置redis服務器的配置文件參數 | 如:可以用來設置密碼(立即生效) config set requirepass 123456 服務器重啟后修改會失效,若想長久保存可追加 “config rewrite”命令 |
| flushdb | 清除當前數據庫 | 危險命令,建議rename-command來規避 |
| flushall | 刪除所有數據庫 | |
| slaveof | SLAVEOF host port 變為指定服務器的從服務器 | 利用SLAVEOF NO ONE可以切換為主服務器 |
| shutdown | 關閉redis服務 |
| info | 以一種易于理解和閱讀的格式, 返回關于Redis服務器的各種信息和統計數值。 | |
| monitor | 用于調試,開啟后顯示服務器當前執行的命令 | ctrl+c結束 |
| object | 查看key的編碼方式,被引用的次數,空閑時間 | |
| dbsize | 返回當前數據里面keys的數量 | |
| role | 返回主從角色 | |
| client list | 返回連接的客戶端列表 | |
| client kill | 關閉指定客戶端連接 |
redis基本特性
1. redis的安全性
-
在redis.conf配置文件里可以通過requirepass password 來設定密碼;也可以在客戶端通過config set requirepass password來設定密碼(立即生效,但服務器重啟后修改會失效,若想長久保存可追加 “config rewrite”命令)。然后連接redis(注意連接成功后但其實并未被授權),可通過auth password輸入密碼通過驗證。注意:因為redis的查詢服務特別快,因此密碼要設置的足夠長,防止暴力破解。
-
高版本的redis安裝完默認只能本地連接 (bind 127.0.0.1),且開啟了保護模式(protected-mode yes ),可以通過修改這兩項來讓其他客戶端連接redis服務。
-
生產環境上對一些危險的命令(如flushdb,flushall,keys,config set,config get等)要禁用或重命名。具體做法是,修改服務器的配置文件redis.conf,在SECURITY這一項中,我們新增以下命令:
更多redis安全內容參考官方中文文檔
附錄
redis2.8-redis.conf
總結
以上是生活随笔為你收集整理的redis - 基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开发中最常使用到那些设计模式?
- 下一篇: redis-高级特性