NoSQL-Redis
Redis和Memcached類似,也屬於k-v數據存儲
Redis官網redis.io, 當前最新穩定版4.0.1
支持更多value類型,除了和string外,還支持hash、lists(鏈表)、sets(集合)和sorted sets(有序集合)
redis使用了兩種文件格式:全量數據(RDB)和增量請求(aof)。全量數據格式是把內存中的數據寫入磁盤,便於下次讀取文件進行加載。增量請求文件則是把內存中的數據序列化為操作請求,用於讀取文件進行replay得到數據,這種類似於mysql binlog。
redis的存儲分為內存存儲、磁盤存儲和log文件三部分
.
安裝
cd /usr/local/src/
wget http://download.redis.io/releases/redis-4.0.1.tar.gz
make && make install
cp redis.conf /etc/redis.conf
vim /etc/redis.conf //修改如下配置
daemonize yes
logfile "/var/log/redis.log"
dir /data/redis_data/
appendonly yes
mkdir /data/redis_data
sysctl vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled
redis-server /etc/redis.conf
Redis持久化
Redis提供了兩種持久化的方式,分別是RDB(Redis DataBase)和AOF(Append Only File)
RDB,簡而言之,就是在不同的時間點,將redis存儲的數據生成快照並存儲到磁盤等介質上。
打開rdb,配置文件裏:
save [秒數] [前述秒數內更改次數] 保存
AOF,則是換了一個角度來實現持久化,那就是將redis執行過的所有寫指令記錄下來,在下次redis重新啟動時,只要把這些寫指令從前到後再重復執行一遍,就可以實現數據恢復了。
打開aof,appendfsync [頻率]
其實RDB和AOF兩種方式也可以同時使用,在這種情況下,如果redis重啟的話,則會優先采用AOF方式來進行數據恢復,這是因為AOF方式的數據恢復完整度更高。
save 900 1 #表示每15分鐘且至少有1個key改變,就觸發一次持久化?
save 300 10 #表示每5分鐘且至少有10個key改變,就觸發一次持久化
save 60 10000 #表示每60秒至少有10000個key改變,就觸發一次持久
save “” #這樣可以禁用rdb持久化
appendonly yes #如果是yes,則開啟aof持久化
appendfilename “appendonly.aof” # 指定aof文件名字
appendfsync everysec #指定fsync()調用模式,有三種no(不調用fsync),always(每次寫都會調用fsync),everysec(每秒鐘調用一次fsync)。第一種最快,第二種數據最安全,但性能會差一些,第三種為這種方案,默認為第三種。
.
redis數據類型
string
string為最簡單的類型,與Memcached一樣的類型,一個key對應一個value,其支持的操作與Memcached的操作類似,它的功能更豐富。設置可以存二進制的對象。
list
list是一個鏈表結構,主要功能是push、pop、獲取一個範圍的所有值等等。操作中key理解為鏈表的名字。
使用 list 結構,我們可以輕松地實現最新消息排行等功能(比如新浪微博的 TimeLine )。list 的另一個應用就是消息隊列,可以利用 list 的 push操作,將任務存在 list 中,然後工作線程再用pop操作將任務取出進行執行。
set
set是集合,和我們數學中的集合概念相似,對集合的操作有添加刪除元素,有對多個集合求交並差等操作。操作中key理解為集合的名字。比如在微博應用中,可以將一個用戶所有的關註人存在一個集合中,將其所有粉絲存在一個集合。因為 Redis 非常人性化的為集合提供了求交集、並集、差集等操作,那麽就可以非常方便的實現如共同關註、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存集到一個新的集合中。
sort-set
sorted set是有序集合,它比set多了一個權重參數score,使得集合中的元素能夠按 score 進行有序排列,比如一個存儲全班同學成績的 Sorted Sets,其集合 value 可以是同學的學號,而 score 就可以是其考試得分,這樣在數據插入集合的時候,就已經進行了天然的排序。
hash
在 Memcached 中,我們經常將一些結構化的信息打包成 hashmap,在客戶端序列化後存儲為一個字符串的值(一般是 JSON 格式),比如用戶的昵稱、年齡、性別、積分等。
.
redis常用操作
set key1 aminglinux
get key1
set key1 aming//第二次賦值會覆蓋
setnx key2 aaa //返回1 如果key2不存在直接創建key
setnx key2 bbb //返回0,如果key2存在,返回0
setex key3 10 1 //給key3設置過期時間為10s,值為1,若key已經存在,會覆蓋新的值
mset k1 1 k2 a k3 c
mget k1 k3 k2
lpush lista a //從左側加入一個元素
lpush lista b
lrange lista 0 -1
lpop lista //從左側取出第一個元素
rpush lista 1 //從右側加入一個元素
rpop lista //從右側取出第一個元素
linsert ?lista ?before ?2 3 ?//在2的前面插入一個元素為3
lset lista 4 bbb ?//把第5個元素修改為bbb
lindex lista 0 ?//查看第1個元素
lindex lista 3 ?//查看第4個元素
llen lista ?//查看鏈表中有幾個元素
sadd seta aaa ?//向集合seta中放入元素
smembers seta ? //查看集合中的所有元素
srem ?seta ? ?aaa //刪除元素
spop ?seta ? ?//隨機取出一個元素,刪除
sdiff ?seta ?setb ? //求差集,以seta為標準
sdiffstore setc seta setb ? //求差集並且存儲,存儲到了setc裏
sinter seta setb //求交集
sinterstore ?setd seta setb ?//將交集存儲setd
sunion seta setb //求並集
sunionstore sete seta setb //求並集並存儲到sete
sismember seta aaa? //判斷一個元素是否屬於一個集合
srandmember ?seta //隨機取出一個元素,但不刪除
zadd zseta 11 123 //創建有序集合
zrange zseta 0 -1 //顯示所有元素,按順序顯示
zrange zseta 0 -1 withscores //可以帶上分值
zrem zseta 222 //刪除指定元素
zrank zseta 222 //返回元素的索引值,索引值從0開始,按score正向排序
zrevrank zseta 222 //同上,不同的是,按score反序排序
zrevrange zseta 0 -1 反序顯示所有元素,並帶分值
zcard zseta //返回集合中所有元素的個數
zcount zseta 1 10 // 返回分值範圍1-10的元素個數
zrangebyscore zseta 1 10 // 返回分值範圍1-10的元素
zremrangebyrank zseta 0 2 //刪除索引範圍0-2的元素,按score正向排序
zremrangebyscore zseta 1 10 //刪除分值範圍1-10的元素
hset user1 ?name aming ?//建立hash
hset user1 age 30
hset user1 job ?it
hgetall user1
hmset user2 ?name aming age 30 ?job it ? ?//批量建立鍵值對
hmget user2
hmget user2 name age ?job
hdel user2 job ? //刪除指定filed
hkeys user2? //打印所有的key
hvals user2 //打印所有的values
hlen user2 ?//查看hash有幾個filed
keys * //取出所有key
keys my* //模糊匹配
exists name //有name鍵 返回1 ,否則返回0;
del key1 // 刪除一個key //成功返回1 ,否則返回0;
EXPIRE key1 100 //設置key1 100s後過期
ttl key // 查看鍵 還有多長時間過期,單位是s,當 key 不存在時,返回 -2 。 當 key 存在但沒有設置剩余生存時間時,返回 -1 。 否則,返回 key 的剩余生存時間。
select 0 //代表選擇當前數據庫,默認進入0 數據庫
move age 1 // 把age 移動到1 數據庫
persist key1 //取消key1的過期時間
randomkey //隨機返回一個key
rename oldname newname //重命名key
type key1 //返回鍵的類型
dbsize? //返回當前數據庫中key的數目
info??//返回redis數據庫狀態信息
flushdb?//清空當前數據庫中所有的鍵
flushall????//清空所有數據庫中的所有的key
bgsave //保存數據到 rdb文件中,在後臺運行
save //作用同上,但是在前臺運行
config get * //獲取所有配置參數
config get dir //獲取配置參數
config set dir //更改配置參數
數據恢復: 首先定義或者確定dir目錄和dbfilename,然後把備份的rdb文件放到dir目錄下面,重啟redis服務即可恢復數據
.
redis安全設置
設置監聽ip
bind 127.0.0.1 2.2.2.2//可以是多個ip,用空格分隔
設置監聽端口
port 16000
設置密碼
requirepass aming>com
redis-cli -a ‘aming>com‘
將config命令改名
rename-command CONFIG aming
禁掉config命令
rename-command CONFIG “”
NoSQL-Redis