<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                簡介 \=========================== 1、redis是一個key-value存儲系統。 2、和Memcached類似,它支持存儲的value類型相對更多,包括**string**(字符串)、**hash**哈希、**list**(鏈表【棧、隊列】)、**set**(集合)和**zset**(有序集合)。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。 3、在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。 區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。 4、Redis 是一個高性能的key-value數據庫。redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關系數據庫起到很好的補充作用。它提供了Python,Ruby,Erlang,PHP客戶端,使用很方便。 性能 \========================================================== **ACID**,指數據庫事務正確執行的四個基本要素的縮寫。包含:**原子性**(Atomicity)、**一致性**(Consistency)、**隔離性**(Isolation)、**持久性**(Durability)。 一個支持事務(Transaction)的數據庫系統,必需要具有這四種特性,否則在事務過程(Transaction processing)當中無法保證數據的正確性,交易過程極可能達不到交易方的要求。  **事物處理** 整個事務中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。 一致性:在事務開始之前和事務結束以后,數據庫的完整性約束沒有被破壞。 隔離性:兩個事務的執行是互不干擾的,一個事務不可能看到其他事務運行時,中間某一時刻的數據。 持久性:在事務完成以后,該事務所對數據庫所作的更改便持久的保存在數據庫之中,并不會被回滾。 具體操作: \=================================== 1\. 安裝redis 并布置環境(指定后臺運行) \# tar -zxvf redis-2.4.17.tar.gz 解壓 \# cd redis-2.4.17 進入目錄 \# make 編譯 \# make PREFIX=/usr/local/redis install 指定目錄安裝 \# cd /usr/local/redis/ 進入安裝后的目錄 \# mkdir etc logs 新建兩個目錄 \# cp /lamp/redis-2.4.17/redis.conf etc/ 復制配置文件 \# cd etc/ \# vi redis.conf 修改配置文件:開啟后臺運行、指定日志文件。 #./redis-server ../etc/redis.conf 啟動 #netstat -tunpl |grep redis \# ./redis-server /usr/local/redis/etc/redis.conf 啟動 \# ps -ef | grep redis 查看進程 \# netstat -tunpl | grep 6379 查看端口 \# ./redis-cli 客戶端命令鏈接服務器 redis 127.0.0.1:6379> redis 127.0.0.1:6379>quit 退出 \# pkill redis-server 結束redis進程。 或: # ./redis-cli shutdown 執行關閉 **Redis****常用命令** \============================= 1\. 鍵值相關命令 \>keys \* //返回鍵(key) \>keys list\* //返回名以list開頭的所有鍵(key) \>exists list1 //判斷鍵名為list1的是否存在 存在返回1, 不存在返回0 \>del list1 //刪除一個鍵(名為list1) \>expire list1 10 //設置鍵名為list1的過期時間為10秒之后 \>ttl list1 //查看鍵名為list1的過期時間,若為\-1表示以過期 \>move age 1 //將鍵名age的轉移到1數據庫中。 \>select 1 //表示進入到1數據庫中,默認在0數據庫 \>persist age //移除age的過期時間(設置為過期) Redis高級實用特性 \================================== 1\. 安全性:為Redis添加密碼 \------------------------------- 1.進入配置文件: vi /usr/local/redis/etc/redis.conf 設置:requirepass redis的密碼 2\. 重啟服務: \# ./redis-cli shutdown 執行關閉 \# ./redis-server /usr/local/redis/etc/redis.conf 啟動 3\. 登錄(兩種) \# ./redis-cli 客戶端命令鏈接服務器 \>auth 密碼值 //授權后方可使用 \# ./redis-cli -a 密碼 //連接時指定密碼來進行授權 2\. 主從復制 \------------------------------------------ 操作步驟: 1.先將linux虛擬機關閉,之后克隆一個。 2.啟動兩個虛擬機:master(主)和slave(從) 3\. 在slave(從)中配置一下ip地址 \# ifconfig eth0 192.168.128.229 \# ping 一下看看通不通。 4\. 配置從機 進入:配置文件 slaveof 192.168.128.228 6379 //配置連接主機的Redis的ip和端口 masterauth 密碼 //配置連接密碼 最后啟動slave(從)機的Redis服務。 其他:可以通過info命令中的role屬性查看自己角色是master、slave 3\. 事務處理 \-------------------------------------------- \>multi //開啟一個事務 \>set age 10 //暫存指令隊列 \>set age 20 \>exec //開始執行(提交事務) 或\>discard //清空指令隊列(事務回滾) 4\. 樂觀鎖 \----------------------------------- 在事務前對被操作的屬性做一個: \> watch age \>multi //開啟一個事務(在此期間有其他修改,則此處會失敗) \>set age 10 //暫存指令隊列 \>set age 20 \>exec //開始執行(提交事務) 或\>discard //清空指令隊列(事務回滾) 5\. 持久化機制(通過修改配置文件做設置) \----------------------------------- 1\. snapshotting(快照)默認方式 配置 save save 900 1 #900秒內如果超過1個key被修改,則發起快照保存 save 300 10 #300秒內容如超過10個key被修改,則發起快照保存 save 60 10000 2\. Append-only file(aof方式) 配置 appendonly on 改為yes 會在bin目錄下產生一個.aof的文件 關于aof的配置 appendonly yes //啟用aof 持久化方式 \# appendfsync always //收到寫命令就立即寫入磁盤,最慢,但是保證完全的持久化 appendfsync everysec //每秒鐘寫入磁盤一次,在性能和持久化方面做了很好的折中 \# appendfsync no //完全依賴os,性能最好,持久化沒保證 6. 發布及訂閱消息 \---------------------- 需要開啟多個會話端口 會話1:\>subscribe tv1 //監聽tv1頻道 會話2:\>subscribe tv1 tv2 //監聽tv1和tv2頻道 會話3: >publish tv1 消息 //向tv1頻道發送一個消息 7\. 使用虛擬內存 \------------------------------- 在redis配置文件中設置 vm-enabled yes #開啟vm功能 vm-swap-file /tmp/redis.swap #交換出來的value保存的文件路徑 vm-max-memory 1000000 #redis使用的最大內存上限 vm-page-size 32 #每個頁面的大小32字節 vm-pages 134217728 #最多使用多少頁面 vm-max-threads 4 #用于執行value對象換入患處的工作線程數量 flushdb:刪除所有的數據 **5****種數據類型:** string(字符串)、hash(哈希表) list(雙向鏈表)、set(集合)和zset(有序集合) **1\. String****(子串類型)** \-------------------------------------------- set 命令:設置一個鍵和值,鍵存在則只覆蓋,返回ok \> set 鍵 值 例如: >set name zhangsan get 命令:獲取一個鍵的值,返回值 \> get 鍵 例如:\>get name setnx命令:設置一個不存在的鍵和值(防止覆蓋), \> setnx 鍵 值 若鍵已存在則返回0表示失敗 setex命令:設置一個指定有效期的鍵和值(單位秒) \> setex 鍵 \[有效時間\] 值 例如: >setex color 10 red 不寫有效時間則表示永久有效,等價于set setrange 鍵 位置 子字串 :替換子字符串 (替換長度由子子串長度決定) 位置 從0算起 \> setrange lichihua 4 aa 將name鍵對應值的第4個位置開始替換,返回lichaaua mset命令:批量設置鍵和值,成功則返回ok \> mset 鍵1 值1 鍵2 值2 鍵3 值3 .... msetnx命令:批量設置不存在的鍵和值,成功則返回ok \> msetnx 鍵1 值1 鍵2 值2 鍵3 值3 .... getset命令:獲取原值,并設置新值 > getset 鍵 新值原值沒有返回nil getrange key start end :獲取指定范圍的值 \>getrange 鍵 0 4 //獲取指定0到4位置上的值 mget命令: 批量獲取值 \>mget 鍵1 鍵2 鍵3.... incr命令: 指定鍵的值做加加操作,返回加后的結果。 整型(正整數或負整數)才能遞增 > 鍵 \>incr kid incrby命令: 設置某個鍵加上指定值 \> incrby 鍵 m //其中m可以是正整數或負整數 \> incrby 3 在原來的基礎上加3 decr 鍵: 指定鍵的值做減減操作,返回減后的結果。 例如: \>decr kid decrby命令: 設置某個鍵減上指定值 \> decrby 鍵 m //其中m可以是正整數或負整數 append命令:給指定key的字符串追加value,返回新字符串值的長度 \>append 鍵 追加字串 strlen 求長度\>strlen 鍵名 //返回對應的值。 **2\. hashes****類型** \------------------------------------------ hset(name, key, value)命令:設置一個哈希表的鍵和值   \>hset hash名 鍵 值 如:\>hset user:001 name zhangsan hget(name,key)命令: 獲取執行哈希名中的鍵對應值 hsetnx(hashname, key, value)命令:設置一個哈希表中不存在的鍵和值   \>hsetnx hash名 鍵 值 //成功返回1,失敗返回0 如:\>hsetnx user:001 name zhangsan hmset命令: hmset user:001 username zhangsan age 20 sex 1 批量設置 hmget: user:001 username age sex:批量獲取值 \>hexists user:001 name //是否存在, 若存在返回1 \>hlen user:001 //獲取某哈希user001名中鍵的數量 \>hdel user:001 name //刪除哈希user:001 中name鍵 \>hkeys user:002 //返回哈希名為user:002中的所有鍵。 \>hvals user:002 //返回哈希名為user:002中的所有值。 \>hgetall user:002 //返回哈希名為user:002中的所有鍵和值。 hincrby(name, key, amount=1)自增name對應的hash中的指定key的值,不存在則創建key=amount hincrbyfloat(name, key, amount=1.0) 自增name對應的hash中的指定key的值,不存在則創建key=amount hscan(name, cursor=0, match=None, count=None) 增量式迭代獲取,對于數據大的數據非常有用,hscan可以實現分片的獲取數據,并非一次性將數據全部獲取完,從而放置內存被撐爆 \# 參數: \# name,redis的name \# cursor,游標(基于游標分批取獲取數據) \# match,匹配指定key,默認None 表示所有的key \# count,每次分片最少獲取個數,默認None表示采用Redis的默認分片個數 \# 如: \# 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None) \# 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None) \# ... \# 直到返回值cursor的值為0時,表示數據已經通過分片獲取完畢 hscan\_iter(name, match=None, count=None) 利用yield封裝hscan創建生成器,實現分批去redis中獲取數據 \# 參數: \# match,匹配指定key,默認None 表示所有的key \# count,每次分片最少獲取個數,默認None表示采用Redis的默認分片個數 \# 如: \# for item in r.hscan\_iter('xx'): # print item **3\. list****類型(雙向鏈表結構)** \-------------------------------------------- list即可以作為“棧”也可以作為"隊列"。 操作: lpush 鍵 值 向隊列頭部插入一個值 \>lpush list1 "world" //在list1頭部壓入一個字串 \>lpush list1 "hello" // 在list1頭部壓入一個字串 lrange 返回隊列指定(索引)區間的值 \>lrange list1 0 -1 //獲取list1中內容 返回隊列指定區間的值 0:表示開頭 \-1表示結尾。 rpush 向隊列的尾部插入一個值 \>rpush list2 "world" //在list2尾部壓入一個字串 \>rpush list2 "hello" // 在list2尾部壓入一個字串 \>lrange list2 0 -1 //獲取list2中內容 0:表示開頭 \-1表示結尾。 linsert 在key對應的list的特定位置的錢或者后面添加字符串 \>linsert list2 before hello there //在list2的hello前加入there lset key index value 修改指定索引位置上的值 \>lset list2 1 "four" 修改指定索引位置上的值 lrem key cout value 移除隊列值 \>lrem list2 2 "hello" //刪除前兩個hello值 \>lrem list2 -2 "hello" //刪除后兩個hello值 \>lrem list2 0 "hello" //刪除所有hello值 ltrim key start stop 刪除給定范圍的值 \>ltrim mylist8 1 3 //刪除此范圍外的值 \>lpop list2 //從list2的頭部刪除元素,并返回刪除元素 \>rpop list2 //從list2的尾部刪除元素,并返回刪除元素 \>rpoplpush list1 list2 //將list1的尾部一個元素移出到list2頭部。并返回 \>lindex list2 1 //返回list2中索引位置上的元素 \>llen list2 //返回list2上長度 blpop?key1 \[key2 \] timeout 移出并獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。> blpop list1 100 ? ? ? ?> blpop list1 list2 100 ? ?brpop?key1 \[key2 \] timeout 移出并獲取列表的最后一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。 ? ? ? ?> brpop list1 100 ? ? ? ?> brpop list1 list2 100 ? ?brpoplpush?list1 another\_list timeout?從列表中彈出一個值,將彈出的元素插入到另外一個列表中并返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。 rpushx?key\_name value1 \[..valuen\] 為依存在的隊列(列表)尾部插入一個或者多個值 lpushx?key\_name value1 \[..valuen\] 為依存在的隊列(列表)頭部插入一個或多個值 **4.****無序集合sets類型和操作** \------------------------------- \>sadd myset "hello" //向myset中添加一個元素 成功返回1,失敗(重復)返回0 \>smembers myset //獲取myset中的所有元素(結果是無序的) \>srem myset "one" //從myset中刪除一個one 成功返回1,失敗(不存在)返回0 \>spop myset //隨機返回并刪除myset中的一個元素 \>srandmember myset //隨機獲取myset中的一個元素,但是不刪除 \> smove myset1 myset2 zhangsan:將myset1中zhangsan移動到myset2中 \> scard myset1 返回myset1的個數 \> sismember myset zhangsan:判斷張三是否在myset中 \>sdiff myset1 myset2 //返回兩個集合的差集以myset1為標準,獲取myset2中不存在的。 \>sdiffstore dstset myset1 myset2 ...// 返回所有集合的差集,并保存到dstset中 \>sinter myset1 myset2 myset3... // 返回N個集合中的交集 \>sinterstore dstset myset1 myset2 ... // 返回N個集合的交集并存儲到dstset中 \> sunion myset1 myset2 ...//返回所有集合的并集 \> sunionstore dstset myset1 myset2// 返回所有集合的并集,并存儲到dstset中 sscan key index \[MATCH pattern\] \[COUNT count\] 迭代(遍歷)集合中key的元值 \>sscan myset1 0 match h\* **5.****有序集合** \----------------------------------------- ? zadd?key\_name score1 value1.. scoren valuen? ?向有序集合添加一個或者多個成員,或者更新已存在成員的分數 score位排序! > zadd myzset 1 "one" 向myzset中添加one,排序為1排序 ? ? > zadd myzset 2 "two" 3 "three" zrem?key member \[member ...\] 移除有序集合中的一個或多個成員 ? ? > zrem myzset one:刪除zset中one zincrby?key increment member 有序集合中對指定成員的分數加上增量 increment ? ? > zincrby zset 2 one:如果one存在,則順序增加2,如果one不存在,那么就是2 ??? zrank?key member 返回有序集合中指定成員的索引 ? ? > zrank zset one:返回one在zset中排名(從小到大的排序) zrevrank?key member 返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序 ? ? > zrevrank zset one:返回one在zset中排名(從大到小的排序) zrange?key start stop \[withscores\] 通過索引區間返回有序集合成指定區間內的成員 ? ? > zrange zset 0 -1 withscores:根據score排序(根據score從小到大排序) zrevrange?key start stop \[withscores\] 返回有序集中指定區間內的成員,通過索引,分數從高到底 ? ? > zrevrange zset 0 -1 withscores:根據score排序(根據score從大到小排序) zrangebyscore?key min max \[withscores\] \[limit offset count\] 通過分數返回有序集合指定區間內的成員 ? ? > zrangebyscore zset 2 3 withscores:返回集合中score在給定區間的元素(包含2和5) zcount?key min max 計算在有序集合中指定區間分數的成員數 ? ? > zcount zset 2 3:返回集合中給定區間的數量 zcard?key\_name 獲取有序集合的成員數 ? ? > zcard zset:返回集合中元素的個數 zscore?key member 返回有序集中,成員的分數值 ? ? > zscore zset one:返回one元素的score zremrangebyrank?key start stop 移除有序集合中給定的排名區間的所有成員 ? ? > zremrangebyrank zset 3 3:刪除集合中排名在給定區間的元素 zremrangebyscore?key min max 移除有序集合中給定的分數區間的所有成員 ? ? > zremrangebyscore zset 1 2:將zset中從小到大排序結果的score在1-2之間的刪除 zinterstore destination numkeys key \[key ...\] \[WEIGHTS weight \[weight ...\]\] \[AGGREGATE SUM|MIN|MAX\] 計算給定的一個或多個有序集的交集并將結果集存儲在新的有序集合 key 中 其中給定 key 的數量必須以 numkeys 參數指定,并將該交集(結果集)儲存到 destination 。默認情況下,結果集中某個成員的分數值是所有給定集下該成員分數值之和。 \# 有序集 mid\_test \> ZADD mid\_test 70 "Li Lei" (integer) 1 \> ZADD mid\_test 70 "Han Meimei" (integer) 1 \> ZADD mid\_test 99.5 "Tom" (integer) 1 \# 另一個有序集 fin\_test \> ZADD fin\_test 88 "Li Lei" (integer) 1 \> ZADD fin\_test 75 "Han Meimei" (integer) 1 \> ZADD fin\_test 99.5 "Tom" (integer) 1 \# 交集 \> ZINTERSTORE sum\_point 2 mid\_test fin\_test (integer) 3 \# 顯示有序集內所有成員及其分數值 \> ZRANGE sum\_point 0 -1 WITHSCORES 1) "Han Meimei" 2) "145" 3) "Li Lei" 4) "158" 5) "Tom" 6) "199" zlexcount key min max 在有序集合中計算指定字典區間內成員數量 \> ZADD myzset 0 a 0 b 0 c 0 d 0 e \> ZADD myzset 0 f 0 g \> ZLEXCOUNT myzset - + (integer) 7 \> ZLEXCOUNT myzset \[b \[f (integer) 5 zrangebylex key min max \[limit offset count\] 通過字典區間返回有序集合的成員 \> zadd myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g \> zrangebylex myzset - \[c 1) "a" 2) "b" 3) "c" \> zrangebylex myzset \[aaa (g 1) "b" 2) "c" 3) "d" 4) "e" 5) "f" zremrangebylex key min max 移除有序集合中給定的字典區間(min和max之間)的所有成員 min個max以\[或者(開頭 可以用\-表示最小值+表示最大值 min和max順序不能相反 \> zadd zset 0 a 0 aa 0 abc 0 apple 0 b 0 c 0 d 0 d1 0 dd 0 dobble 0 z 0 z1 \> zremrangebylex zset \[d1 (dd 刪除d1這個元素 \> zremrangebylex zset \[a \[apple \> zrange zset 0 -1 withscores \> zremrangebylex zset - + zrevrangebyscore key max min \[withscores\] \[limit offset count\] 返回有序集中指定分數區間內的成員,分數從高到低排序 \> ZADD salary 10086 jack \> ZADD salary 5000 tom \> ZADD salary 7500 peter \> ZADD salary 3500 joe \> ZREVRANGEBYSCORE salary +inf -inf \# 逆序排列所有成員 1) "jack" 2) "peter" 3) "tom" 4) "joe" \> ZREVRANGEBYSCORE salary 10000 2000 \# 逆序排列薪水介于 10000 和 2000 之間的成員 1) "peter" 2) "tom" 3) "joe" zunionstore destination numkeys key \[key ...\] \[WEIGHTS weight \[weight ...\]\] \[AGGREGATE SUM|MIN|MAX\] 計算給定的一個或多個有序集的并集,并存儲在新的 key 中 其中給定 key 的數量必須以 numkeys 參數指定,并將該并集(結果集)儲存到 destination,默認情況下,結果集中某個成員的分數值是所有給定集下該成員分數值之和 。 \> ZADD zset1 1 "one" \> ZADD zset1 2 "two" \> ZADD zset2 1 "one" \> ZADD zset2 2 "two" \> ZADD zset2 3 "three" \> zunionstore out 2 zset1 zset2 WEIGHTS 2 3 \> zrange out 0 -1 WITHSCORES 1) "one" 2) "5" 3) "three" 4) "9" 5) "two" 6) "10" zscan key cursor \[MATCH pattern\] \[COUNT count\] 迭代有序集合中的元素(包括元素成員和元素分值)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看