Redis高性能數據庫

Redis高性能數據庫

1、Redis概述;
2、應用場景分析;
3、Redis的數據回收策略;
4、案例:搭建Redis高性能數據庫;php

1、Redis概述:

概述:redis是一個可持久化的單進程單線程key-value類型高速內存緩存系統,和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(列表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做。
與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會按期經過異步操做把數據庫數據flush到硬盤上進行保存。由於是純內存操做,Redis的性能很是出色,每秒能夠處理超過 10萬次讀寫操做,是已知性能最快的Key-Value DB,而且在此基礎上實現了master-slave(主從)同步,當前 Redis的應用已經很是普遍,國內像新浪、淘寶,國外像 Flickr、Github等均在使用Redis的緩存服務。官網地址:https://redis.io/ ,目前由redis項目的開發和維護由vmware廠商負責提供支持;html

優勢:
1.性能極高--Redis能支持超過 100K+ 每秒的讀寫頻率。
2.豐富的數據類型--Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操做。
3.原子性--Redis的全部操做都是原子性(即全部操做要麼成功要麼失敗不執行),同時Redis還支持對幾個操做全並後的原子性執行。
4.Redis運行在內存中可是能夠持久化到磁盤,因此在對不一樣數據集進行高速讀寫時須要權衡內存,由於數據量不能大於硬件內存。在內存數據庫方面的另外一個優勢是,相比在磁盤上相同的複雜的數據結構,在內存中操做起來很是簡單,這樣Redis能夠作不少內部複雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,由於他們並不須要進行隨機訪問。git

2、應用場景分析:

MySql+Memcached架構的問題:實際MySQL是適合進行海量數據存儲的,經過Memcached將熱點數據加載到cache,加速訪問,不少公司都曾經使用過這樣的架構,但隨着業務數據量的不斷增長,和訪問量的持續增加,咱們遇到了不少問題:
1.MySQL須要不斷進行拆庫拆表,Memcached也需不斷跟着擴容,擴容和維護工做佔據大量開發時間。
2.Memcached與MySQL數據庫數據一致性問題。
3.Memcached數據命中率低或down機,大量訪問直接穿透到DB,MySQL沒法支撐。
4.跨機房cache同步問題。github

Redis的應用場景:
Redis高性能數據庫
Redis更像一個增強版的Memcached,那麼什麼時候使用Memcached,什麼時候使用Redis呢?
1.Redis不只僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
2.Redis支持數據的備份,即master-slave模式的數據備份。
3.Redis支持數據的持久化,能夠將內存中的數據保持在磁盤中,重啓的時候能夠再次加載進行使用。
4.Memcached:動態系統中減輕數據庫負載,提高性能;作緩存,適合多讀少寫,大數據量的狀況(如人人網大量查詢用戶信息、好友信息、文章信息等)。
 Redis:適用於對讀寫效率要求都很高,數據處理業務複雜和對安全性要求較高的系統(如新浪微博的計數和微博發佈部分系統,對數據安全性、讀寫要求都很高)。redis

3、Redis的數據回收策略:

Redis的回收策略:
volatile-lru:從已設置過時時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰;
volatile-ttl:從已設置過時時間的數據集(server.db[i].expires)中挑選將要過時的數據淘汰;
volatile-random:從已設置過時時間的數據集(server.db[i].expires)中任意選擇數據淘汰;
allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰;
allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰;
no-enviction(驅逐):禁止驅逐數據;數據庫

4、案例:搭建Redis高性能數據庫:

Redis高性能數據庫

實驗步驟:
安裝並配置Redis服務;
調整Redis服務的配置;
結合PHP測試Redis服務;
Redis中操做之String;
Redis中操做之list;
Redis中操做之set;
Redis中操做之zset;
Redis中操做之hash;
Redis中操做之其餘操做;
json

安裝並配置Redis服務;
[root@redis ~]# wget http://download.redis.io/releases/redis-4.0.9.tar.gz
[root@redis ~]# tar zxvf redis-4.0.9.tar.gz 
[root@redis ~]# cd redis-4.0.9
[root@redis redis-4.0.9]# make 
[root@redis redis-4.0.9]# echo $?
[root@redis redis-4.0.9]# cd
[root@redis ~]# mkdir -p /usr/local/redis
[root@redis ~]# cp /root/redis-4.0.9/src/redis-server /usr/local/redis/     ##服務端程序
[root@redis ~]# cp /root/redis-4.0.9/src/redis-cli /usr/local/redis/            ##客戶端程序
[root@redis ~]# cp /root/redis-4.0.9/redis.conf /usr/local/redis/               ##主配置文件
[root@redis ~]# ls /usr/local/redis/
redis-cli  redis.conf  redis-server
[root@redis ~]# sed -i '/^bind 127.0.0.1$/s/127.0.0.1/192.168.100.101/g' /usr/local/redis/redis.conf    
[root@redis ~]# sed -i '/protected-mode/s/yes/no/g' /usr/local/redis/redis.conf             ##關閉redis的保護模式
[root@redis ~]# sed -i '/daemonize/s/no/yes/g' /usr/local/redis/redis.conf                  ##開啓redis的後臺守護進程模式
[root@redis ~]# sed -i '/requirepass/s/foobared/123123/g' /usr/local/redis/redis.conf       ##設置redis的密碼爲123123
[root@redis ~]# sed -i '/requirepass 123123/s/^#//g' /usr/local/redis/redis.conf            ##開啓redis的密碼

附:redis.conf主配置文件詳解
daemonize yes  #之後臺daemon方式運行redis
pidfile "/var/run/redis.pid"  #redis之後臺運行,默認pid文件路徑/var/run/redis.pid
port 6379  #默認端口
bind 127.0.0.1 #默認綁定本機全部ip地址,爲了安全,能夠只監聽內網ip
timeout 300 #客戶端超時設置,單位爲秒
loglevel verbose  #設置日誌級別,支持四個級別:debug、notice、verbose、warning
logfile stdout  #日誌記錄方式,默認爲標準輸出,logs不寫文件,輸出到空設備/deb/null
logfile "/usr/local/redis/var/redis.log"  #能夠指定日誌文件路徑
databases 16  #開啓數據庫的數量
save 900 1
save 300 10
save 60 10000
建立本地數據庫快照,格式:save * *
900秒內,執行1次寫操做後觸發快照
300秒內,執行10次寫操做
60秒內,執行10000次寫操做
rdbcompression yes #啓用數據庫lzf壓縮,也能夠設置爲no
dbfilename dump.rdb  #本地快照數據庫名稱
dir "/usr/local/redis/var/"   #本地快照數據庫存放目錄
requirepass 123456  #設置redis數據庫鏈接密碼
maxclients 10000 #同一時間最大客戶端鏈接數,0爲無限制
maxmemory 1024MB #設定redis最大使用內存,值要小於物理內存,必須設置
appendonly yes  #開啓日誌記錄,至關於MySQL的binlog
appendfilename "appendonly.aof"   #日誌文件名,注意:不是目錄路徑
appendfsync everysec #設置日誌同步的頻率,每秒執行同步,還有兩個參數always、no通常設置爲everysec,至關於MySQL事物日誌的寫方式
Slaveof 設置數據庫爲其餘數據庫的從數據庫
Masterauth 主數據庫鏈接須要的密碼驗證
vm-enabled 是否開啓虛擬內存支持 (vm開頭的參數都是配置虛擬內存的)
vm-swap-file 設置虛擬內存的交換文件路徑
vm-max-memory 設置redis使用的最大物理內存大小
vm-page-size 設置虛擬內存的頁大小
vm-pages 設置交換文件的總的page數量
vm-max-threads 設置使用swap存儲同時使用的線程數量,一般設置值爲核心數相同,若是設置爲0,則會以串行方式,對數據的完整性有着極大的保證
Glueoutputbuf 把小的輸出緩存存放在一塊兒
hash-max-zipmap-entries 設置hash的臨界值
Activerehashing 從新hash

[root@redis ~]# cat <<END >>/etc/init.d/redis
#!/bin/sh
# chkconfig: 2345 80 90
# description: Start and Stop redis
#PATH=/usr/local/bin:/sbin:/usr/bin:/bin
REDISPORT=6379
EXEC=/usr/local/redis/redis-server
REDIS_CLI=/usr/local/redis/redis-cli
PIDFILE=/var/run/redis_6379.pid
CONF="/usr/local/redis/redis.conf"
AUTH="123123"
LISTEN_IP=\$(netstat -utpln |grep redis-server |awk '{print \$4}'|awk -F':' '{print \$1}')

case "\$1" in
    start)
        if [ -f \$PIDFILE ]
        then
                echo "\$PIDFILE exists, process is already running or crashed"
        else
                echo "Starting Redis server..."
                \$EXEC \$CONF
        fi
        if [ "\$?"="0" ]
        then
              echo "Redis is running..."
        fi
        ;;
    stop)
        if [ ! -f \$PIDFILE ]
        then
                echo "\$PIDFILE does not exist, process is not running"
        else
                PID=\$(cat \$PIDFILE)
                echo "Stopping ..."
                \$REDIS_CLI -h \$LISTEN_IP -p \$REDISPORT -a \$AUTH SHUTDOWN
                while [ -x \${PIDFILE} ]
               do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
   restart|force-reload)
        \${0} stop
        \${0} start
        ;;
  *)
    echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
        exit 1
esac
END
[root@redis ~]# chmod 755 /etc/init.d/redis
[root@redis ~]# chkconfig --add redis
[root@redis ~]# /etc/init.d/redis start
Starting Redis server...
4390:C 04 May 02:16:45.232 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4390:C 04 May 02:16:45.232 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=4390, just started
4390:C 04 May 02:16:45.232 # Configuration loaded
Redis is running...
[root@redis ~]# netstat -utpln |grep redis
tcp        0      192.168.100.101:6379            0.0.0.0:*               LISTEN      4204/redis-server *

調整Redis服務的配置:
[root@redis ~]# cp /root/redis-4.0.9/src/redis-benchmark /usr/local/redis/
[root@redis ~]# cp /root/redis-4.0.9/src/redis-check-rdb /usr/local/redis/
[root@redis ~]# cp /root/redis-4.0.9/src/redis-check-aof /usr/local/redis/
[root@redis ~]# cp /root/redis-4.0.9/src/redis-sentinel /usr/local/redis/
[root@redis ~]# ls /usr/local/redis/
dump.rdb  redis-benchmark  redis-cli  redis.conf  redis-server

[root@redis ~]# ln -s /usr/local/redis/redis-cli /usr/bin/redis
[root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123
192.168.100.101:6379> set name lwh
OK
192.168.100.101:6379> get name
"lwh"
192.168.100.101:6379> exit
[root@redis ~]# ln -s /usr/local/redis/redis-benchmark /usr/bin/redis-benchmark
[root@redis ~]# redis-benchmark -h 192.168.100.101 -p 6379 -c 1000 -n 10000

結合PHP測試Redis服務;
[root@redis ~]# yum -y install httpd php php-redis php-devel
[root@redis ~]# php -v
PHP 5.4.16 (cli) (built: Mar  7 2018 13:34:47) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
[root@redis ~]# wget https://codeload.github.com/phpredis/phpredis/tar.gz/4.0.2
[root@redis ~]# tar zxvf phpredis-4.0.2.tar.gz 
[root@redis ~]# cd phpredis-4.0.2
[root@redis phpredis-4.0.2]# /usr/bin/phpize 
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525
[root@redis phpredis-4.0.2]# ./configure --with-php-config=/usr/bin/php-config 
[root@redis phpredis-4.0.2]# make && make install
[root@redis phpredis-4.0.2]# echo $?
0
[root@redis phpredis-4.0.2]# cd
[root@redis ~]# echo -e "extension_dir = \"/usr/lib64/php/modules/\"\nextension = redis.so" >>/etc/php.ini
[root@redis ~]# systemctl start httpd
[root@redis ~]# netstat -utpln |grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      19008/httpd
[root@redis ~]# cat <<END >>/var/www/html/index.php
<?php
phpinfo();
?>
END
[root@redis ~]# cat <<END >>/var/www/html/test.php
<?php
\$redis = new Redis();
\$redis->connect('192.168.100.101',6379);
\$redis->auth('123123');
\$keys = \$redis->keys("*");
var_dump(\$keys);
?>
END

Redis高性能數據庫
Redis高性能數據庫

Redis中操做之String  -- 字符串(注意:redis中的語句能夠tab補全);
概述:String是簡單的 key-value 鍵值對,value 不只能夠是 String,也能夠是數字。String在redis內部存儲默認就是一個字符串,被redisObject所引用,當遇到incr,decr等操做時會轉成數值型進行計算,此時redisObject的encoding字段爲int。
[root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123
192.168.100.101:6379> set hello world
OK
192.168.100.101:6379> get hello
"world"
192.168.100.101:6379> EXISTS hello          ##驗證key是否存在
(integer) 1
192.168.100.101:6379> type hello
string
192.168.100.101:6379> substr hello 1 2      ##查看key的第1和2兩個字符
"or"
192.168.100.101:6379> append hello !            ##在key後添加字符!
(integer) 6
192.168.100.101:6379> get hello
"world!"
192.168.100.101:6379> set haha heihei
OK
192.168.100.101:6379> keys h*               ##查看以h開頭的Key
1) "haha"
2) "hello"
192.168.100.101:6379> set name xiaoming
OK
192.168.100.101:6379> keys *
1) "haha"
2) "hello"
3) "name"
192.168.100.101:6379> RANDOMKEY         ##隨機返回一個Key
"name"
192.168.100.101:6379> keys *
1) "haha"
2) "hello"
3) "name"
192.168.100.101:6379> RANDOMKEY
"haha"
192.168.100.101:6379> RENAME haha hehe
OK
192.168.100.101:6379> keys *
1) "hehe"
2) "name"
3) "hello"
192.168.100.101:6379> DEL hehe
(integer) 1
192.168.100.101:6379> keys *
1) "name"
2) "hello"
192.168.100.101:6379> get name
"xiaoming"
192.168.100.101:6379> set name xiaohong
OK
192.168.100.101:6379> get name
"xiaohong"
192.168.100.101:6379> expire name 10        ##設置KEY值的超時時間
(integer) 1
192.168.100.101:6379> ttl name              ##查看KEY值當前剩餘的超時時間
(integer) 4
192.168.100.101:6379> get name
"xiaohong"
192.168.100.101:6379> get name
(nil)
192.168.100.101:6379> keys *            
1) "hello"

Redis中操做之list -- 列表;
概述:Redis列表是簡單的字符串列表,能夠類比到C++中的std::list,簡單的說就是一個鏈表或者說是一個隊列。能夠從頭部或尾部向Redis列表添加元素。列表的最大長度爲2^32 - 1,也即每一個列表支持超過40億個元素。Redis list的實現爲一個雙向鏈表,便可以支持反向查找和遍歷,更方便操做,不過帶來了部分額外的內存開銷,Redis內部的不少實現,包括髮送緩衝隊列等也都是用的這個數據結構。
應用場景:Redis list的應用場景很是多,也是Redis最重要的數據結構之一,好比twitter的關注列表、粉絲列表等均可以用Redis的list結構來實現,再好比有的應用使用Redis的list類型實現一個簡單的輕量級消息隊列,生產者push,消費者pop/bpop。數組

[root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123
192.168.100.101:6379> rpush list1 1         ##建立列表並在尾部插入元素
(integer) 1
192.168.100.101:6379> rpush list1 2
(integer) 2
192.168.100.101:6379> lrange list1 0 1          ##驗證列表中的第0個元素到第1個元素
1) "1"
2) "2"
192.168.100.101:6379> lpush list1 0         ##在列表頭部插入元素
(integer) 3
192.168.100.101:6379> lrange list1 0 1
1) "0"
2) "1"
192.168.100.101:6379> lrange list1 0 2          ##驗證列表中的第0個元素到第2個元素
1) "0"
2) "1"
3) "2"
192.168.100.101:6379> llen list1                ##查看列表中的元素的數量
(integer) 3
192.168.100.101:6379> lindex list1 1            ##定位到列表中的第1個元素
"1"
192.168.100.101:6379> ltrim list1 1 2           ##截取列表中的第1個元素到第2個元素
OK
192.168.100.101:6379> lrange list1 0 10     ##查看列表中第0個元素到第10個元素
1) "1"
2) "2"
192.168.100.101:6379> lset list1 1 haha     ##更改列表中的第1個元素值爲haha
OK
192.168.100.101:6379> lrange list1 0 10
1) "1"
2) "haha"
192.168.100.101:6379> lset list1 2 haha     ##驗證更改時的元素位置不能大於現有元素的數量
(error) ERR index out of range
192.168.100.101:6379> lrange list1 0 10
1) "1"
2) "haha"
192.168.100.101:6379> rpush list1 haha      ##在列表尾部插入新的元素
(integer) 3
192.168.100.101:6379> lrange list1 0 10
1) "1"
2) "haha"
3) "haha"
192.168.100.101:6379> lrem list1 2 haha     ##刪除列表中兩個值爲haha的元素
(integer) 2
192.168.100.101:6379> lrange list1 0 10
1) "1"
192.168.100.101:6379> rpush list1 haha
(integer) 2
192.168.100.101:6379> rpush list1 haha
(integer) 3
192.168.100.101:6379> rpush list1 haha
(integer) 4
192.168.100.101:6379> rpush list1 haha
(integer) 5
192.168.100.101:6379> lrange list1 0 10
1) "1"
2) "haha"
3) "haha"
4) "haha"
5) "haha"
192.168.100.101:6379> lpop list1                ##刪除列表內開頭的第一個元素
"1"
192.168.100.101:6379> lrange list1 0 10
1) "haha"
2) "haha"
3) "haha"
4) "haha"
192.168.100.101:6379> lpop list1
"haha"
192.168.100.101:6379> lrange list1 0 10
1) "haha"
2) "haha"
3) "haha"

Redis中操做之set -- 無序集合;
概述:能夠理解爲一堆值不重複的列表,相似數學領域中的集合概念,且Redis也提供了針對集合的求交集、並集、差集等操做。set 的內部實現是一個 value永遠爲null的HashMap,實際就是經過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內的緣由。
應用場景:Redis set對外提供的功能與list相似是一個列表的功能,特殊之處在於set是能夠自動排重的,當你須要存儲一個列表數據,又不但願出現重複數據時,set是一個很好的選擇,而且set提供了判斷某個成員是否在一個set集合內的重要接口,這個也是list所不能提供的。又或者在微博應用中,每一個用戶關注的人存在一個集合中,就很容易實現求兩我的的共同好友功能。緩存

[root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123
192.168.100.101:6379> sadd set1 0       ##建立set1並賦值0
(integer) 1
192.168.100.101:6379> sadd set1 1       ##在set1後追加值1
(integer) 1
192.168.100.101:6379> smembers set1     ##顯示set1的全部值
1) "0"
2) "1"
192.168.100.101:6379> scard set1        ##顯示set1的基數
(integer) 2 
192.168.100.101:6379> sismember set1 0          ##顯示set1中是否包含值爲0的元素 
(integer) 1
192.168.100.101:6379> srandmember set1      ##隨機返回set1中的的元素值
"0"
192.168.100.101:6379> sadd set2 0               ##建立set2並添加元素
(integer) 1
192.168.100.101:6379> sadd set2 2       
(integer) 1
192.168.100.101:6379> sinter set1 set2          ##過濾set1與set2的交集
1) "0"
192.168.100.101:6379> sinterstore set3 set1 set2    ##將set1與set2的交集保存到set3
(integer) 1
192.168.100.101:6379> smembers set3 
1) "0"
192.168.100.101:6379> sunion set1 set2          ##過濾set1與set2的並集
1) "0"
2) "1"
3) "2"
192.168.100.101:6379> sdiff set1 set2           ##相對與set2來說,set1的差集
1) "1"
192.168.100.101:6379> sdiff set2 set1               ##相對比set1來說,set2的差集
1) "2"
192.168.100.101:6379> keys *                    ##查看已經存在的各類數據類型的鍵
1) "set1"
2) "hello"
3) "list"
4) "list1"
5) "set2"

Redis中操做之zset -- 有序集合;
概述:Redis有序集合相似Redis無序集合,不一樣的是增長了一個功能,即集合是有序的。一個有序集合的每一個成員帶有分數,用於進行排序。Redis有序集合添加、刪除和測試的時間複雜度均爲O(1)(固定時間,不管裏面包含的元素集合的數量)。列表的最大長度爲2^32- 1元素(4294967295,超過40億每一個元素的集合)。
Redis sorted set的內部使用HashMap和跳躍表(SkipList)來保證數據的存儲和有序,HashMap裏放的是成員到score的映射,而跳躍表裏存放的是全部的成員,排序依據是HashMap裏存的score,使用跳躍表的結構能夠得到比較高的查找效率,而且在實現上比較簡單。
使用場景:Redis sorted set的使用場景與set相似,區別是set不是自動有序的,而sorted set能夠經過用戶額外提供一個優先級(score)的參數來爲成員排序,而且是插入有序的,即自動排序。當你須要一個有序的而且不重複的集合列表,那麼能夠選擇sorted set數據結構; 安全

[root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123
192.168.100.101:6379> zadd zset1 1 baidu.com            ##建立集合zset1,添加元素baidu.com,而且設置元素的score值(有序集合的序列號)爲1
(integer) 1
192.168.100.101:6379> zadd zset1 2 sina.com
(integer) 1
192.168.100.101:6379> zadd zset1 3 qq.com
(integer) 1
192.168.100.101:6379> zrange zset1 0 2              ##查看集合zset1中的元素
1) "baidu.com"
2) "sina.com"
3) "qq.com"
192.168.100.101:6379> zcard zset1                   ##查看集合zset1中的基數
(integer) 3
192.168.100.101:6379> zscore zset1 baidu.com            ##驗證元素baidu.com在集合zset1中的score值
"1"
192.168.100.101:6379> zscore zset1 qq.com           ##驗證元素qq.com在集合zset1中的score值
"3"
192.168.100.101:6379> zrevrange zset1 0 1               ##倒序查找集合中的元素,
1) "qq.com"
2) "sina.com"
192.168.100.101:6379> zrem zset1 qq.com             ##刪除集合中的元素qq.com
(integer) 1
192.168.100.101:6379> zrange zset1 0 5              ##驗證集合中的全部元素
1) "baidu.com"
2) "sina.com"
192.168.100.101:6379> zincrby zset1 5 taobao.com        ##設置該元素score值爲5.如若此元素不存在,則會添加到集合中
"5"
192.168.100.101:6379> zrange zset1 0 5              ##驗證集合中的原色
1) "baidu.com"
2) "sina.com"
3) "taobao.com"
192.168.100.101:6379> zrange zset1 0 5 withscores       ##查看集合中的元素值而且輸出其自己的score值
1) "baidu.com"
2) "1"
3) "sina.com"
4) "2"
5) "taobao.com"
6) "5"
192.168.100.101:6379> zincrby zset1 10 haha.com     ##添加新元素haha.com並指定其自己score值
"10"
192.168.100.101:6379> zrange zset1 0 5 withscores       ##驗證元素的排序
1) "baidu.com"
2) "1"
3) "sina.com"
4) "2"
5) "taobao.com"
6) "5"
7) "haha.com"
8) "10"
192.168.100.101:6379> zincrby zset1 15 baidu.com        ##如若新添加的元素已經存在,那麼會在原有score值的基礎上增長指定得score值
"16"
192.168.100.101:6379> zrange zset1 0 5 withscores       ##驗證元素baidu.com的score值變爲16,增長了15,並排序到集合的末尾
1) "sina.com"   
2) "2"
3) "taobao.com"
4) "5"
5) "haha.com"
6) "10"
7) "baidu.com"
8) "16"
注:此外, 還有zrevrank, zrevrange, zrangebyscore, zremrangebyrank, zramrangebyscore, zinterstore/zunionstore等操做

Redis中操做之hash ;
概述:相似C#中的dict類型或者C++中的hash_map類型。Redis Hash對應Value內部實際就是一個HashMap,這個Hash的成員比較少時Redis爲了節省內存會採用相似一維數組的方式來緊湊存儲,而不會採用真正的HashMap結構,對應的value redisObject的encoding爲zipmap,當成員數量增大時會自動轉成真正的HashMap,此時encoding爲ht。
應用場景:假設有多個用戶及對應的用戶信息,能夠用來存儲以用戶ID爲key,將用戶信息序列化爲好比json格式作爲value進行保存。

[root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123
192.168.100.101:6379> hset hash1 key1 value1                ##設置鍵值hash1,而且指定內部key與value對應
(integer) 1
192.168.100.101:6379> hget hash1 key1           ##查看hash1中的key1的值
"value1"
192.168.100.101:6379> hexists hash1 key1            ##檢查hash1中是否有key1
(integer) 1
192.168.100.101:6379> hset hash1 key2 value2        ##在hash1中建立key2
(integer) 1
192.168.100.101:6379> hlen hash1                ##查看hash1中鍵值的基數
(integer) 2
192.168.100.101:6379> hkeys hash1               ##查看hash1中具體包含的鍵
1) "key1"
2) "key2"
192.168.100.101:6379> hvals hash1               ##查看hash1中具體包含的值
1) "value1"
2) "value2"
192.168.100.101:6379> hmget hash1 key1 key2     ##經過明確指定hash1中的key,去查看值是什麼
1) "value1"
2) "value2"
192.168.100.101:6379> hgetall hash1             ##查看hash1中包含的全部鍵和值的對應
1) "key1"
2) "value1"
3) "key2"
4) "value2"
192.168.100.101:6379> hset hash1 key4 10            ##添加新鍵key4,值爲整數10
(integer) 1
192.168.100.101:6379> hincrby hash1 key4 15     ##將key4執行計算加10(僅限整數)
(integer) 25
192.168.100.101:6379> hmset hash1 key5 value5 key6 value6 key7 value7       ##批量添加鍵值對
OK
192.168.100.101:6379> hgetall hash1             ##驗證批量添加的鍵值對
 1) "key1"
 2) "value1"
 3) "key2"
 4) "value2"
 5) "key3"
 6) "value3"
 7) "key4"
 8) "25"
 9) "key5"
10) "value5"
11) "key6"
12) "value6"
13) "key7"
14) "value7"

Redis中操做之其餘操做;
[root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123
192.168.100.101:6379> dbsize                ##查看全部key的數目 
192.168.100.101:6379> flushdb               ##刪除當前選擇數據庫中的全部key 
192.168.100.101:6379> flushall                  ##刪除全部數據庫中的全部key 
192.168.100.101:6379> save                  ##將數據同步保存到磁盤 
192.168.100.101:6379> bgsave                ##異步保存 
192.168.100.101:6379> lastsave              ##上次成功保存到磁盤的Unix時間戳 
192.168.100.101:6379> info                  ##查詢server信息 
192.168.100.101:6379> slaveof               ##改變複製策略設置
相關文章
相關標籤/搜索