第二節、Redis

7952 ワード

Redis作用
Redisはnosqlの非関係型データベースであり、一般的にlinuxシステムに配備され、データはメモリに保存されるとともに、Redisはメモリデータを定期的にディスクに同期することができ、多種の言語のAPIインタフェースを提供し、データを持続化することができ、操作も比較的便利であり、key-valueのキー値対応データベースredisデータベースコマンドは大文字と小文字を区別しないことが理解できる.でもkeyとvalueは区別に注意
Redisのインストール
烏班図システムを例にとると、ソースを更新してから直接インストールすればよい.
pyvip@vip:~$  sudo apt-get update           
pyvip@vip:~$ sudo apt-get -y install redis-server

redisポート6379プロファイル/etc/redis/redis.confを使用してプロファイルを変更
pyvip@vip:~$ sudo vim  /etc/redis/redis.conf
42 daemonize yes
#  yes              
46 pidfile /var/run/redis/redis-server.pid
#    pid      ,     redis   ,       pid     
50 port 6379
#     ,    
69 bind 127.0.0.1
#  redis       IP     ,          redis,     0.0.0.0,127.0.0.1        

操作Redis
Redisを操作する方法は2つあります
  • クライアントredis-cliを直接使用
  • #    
    pyvip@vip:~$ redis-cli
    127.0.0.1:6379> exit
    #    
    pyvip@vip:~$ redis-cli -h 192.168.X.X  -p 6379
    
  • python、javaなどのアセンブリ言語呼び出し
  • Redisの5つの基本データ型
  • string文字列
  • listリスト
  • hashハッシュ
  • set集合
  • sorted sets秩序集合
  • redisにおける文字列の関連操作
    #   key       :set  key  value,key       ,           ,            ,            (        )
    127.0.0.1:6379> set name 'hello allan'
    OK
    #  key  value,  :get key
    127.0.0.1:6379> get name
    "hello allan"
    #  key     
    #key       :expire key seconds    
    127.0.0.1:6379> expire name 30
    (integer) 1
    #      ,   key    nil  
    127.0.0.1:6379> ttl name
    (integer) 26
    127.0.0.1:6379> ttl name
    (integer) -2
    127.0.0.1:6379> get name
    (nil)
    # key              ,  :set key value ex seconds
    127.0.0.1:6379> set na "hell word" ex 60
    OK
    127.0.0.1:6379> ttl na
    (integer) 54
    127.0.0.1:6379> get na
    "hell word"
    # key      :append key value,  integer       
    127.0.0.1:6379> append name "lili"
    (integer) 9
    127.0.0.1:6379> get name
    "allanlili"
    #      key     key,mset,mget      
    127.0.0.1:6379> mset username "alex" passwd "qwer"
    OK
    127.0.0.1:6379> mget username passwd
    1) "alex"
    2) "qwer"
    #     key
    127.0.0.1:6379> keys *
    1) "passwd"
    2) "username"
    3) "name"
    #  key    ,  :exists key
    127.0.0.1:6379> exists name
    (integer) 1
    127.0.0.1:6379> exists nb
    (integer) 0
    #  key  :del key        
    127.0.0.1:6379> del name
    (integer) 1
    #      :type key
    127.0.0.1:6379> type passwd
    string
    #    key 1,      
    127.0.0.1:6379> set rc 1
    OK
    127.0.0.1:6379> incr rc
    (integer) 2
    127.0.0.1:6379> incr rc
    (integer) 3
    127.0.0.1:6379> decr rc
    (integer) 2
    127.0.0.1:6379> get rc
    "2"
    #      :incrby/decrby  key     
    127.0.0.1:6379> incrby rc 100
    (integer) 102
    127.0.0.1:6379> decrby rc 50
    (integer) 52
    127.0.0.1:6379> get rc
    "52"
    

    redisのリストリスト関連アクション
    #   lpush
    #   rpsuh
    #  lrange        ,    (     )      
    #      lindex key index
    127.0.0.1:6379> rpush my_list 1 2 3
    (integer) 3
    127.0.0.1:6379> lpush my_list 4 5 6
    (integer) 6
    127.0.0.1:6379> type my_list
    list
    127.0.0.1:6379> lrange my_list 0 -1
    1) "6"
    2) "5"
    3) "4"
    4) "1"
    5) "2"
    6) "3"
    127.0.0.1:6379> lrange my_list 0 0
    1) "6"
    127.0.0.1:6379> lrange my_list 0 1
    1) "6"
    2) "5"
    127.0.0.1:6379> lindex my_list 1
    "5"
    #        llen
    127.0.0.1:6379> llen my_list
    (integer) 6
    #         lpop
    #         rpop
    #      lrem
    lrem key count value
    count>0      count     
    count<0      count     
    count=0    
    127.0.0.1:6379> lrem key 0 5
    #        5
    127.0.0.1:6379> lrem key 2 5
    #         2 5
    

    redisにおけるハッシュhash関連動作
    jsonのフォーマット
    #  hset  :hset key filed value
    #  gset
    #  hdel
    #    hmset
    127.0.0.1:6379> hset user username allan
    (integer) 1
    127.0.0.1:6379>  hset user age 18
    (integer) 1
    127.0.0.1:6379> type user
    hash
    127.0.0.1:6379> hget user username
    "allan"
    #     
    127.0.0.1:6379> hgetall user
    1) "username"
    2) "allan"
    3) "age"
    4) "18"
    #    filed,hkeys
    #    value,hvals
    #  filed  ,hlen
    127.0.0.1:6379> hmset web baidu baidu.com  qq  qq.com
    OK
    127.0.0.1:6379> hkeys web
    1) "baidu"
    2) "qq"
    127.0.0.1:6379> hvals web
    1) "baidu.com"
    2) "qq.com"
    127.0.0.1:6379> hlen web
    (integer) 2
    127.0.0.1:6379> hmget web baidu qq
    1) "baidu.com"
    2) "qq.com"
    

    redis内の集合set関連操作
    #  sadd key value value        
    #  smembers key
    127.0.0.1:6379> sadd mset 1 1 1
    (integer) 1
    127.0.0.1:6379> sadd mset 2 4 5
    (integer) 3
    127.0.0.1:6379> smembers mset
    1) "1"
    2) "2"
    3) "4"
    4) "5"
    #    spop key
    #    srem key member
    127.0.0.1:6379> srem mset 1
    (integer) 1
    127.0.0.1:6379> spop mset
    "4"
    127.0.0.1:6379> smembers mset
    1) "2"
    2) "5"
    #              smove  oldkey  newkey  value
    #   sinter  key1  key2
    #   sunion  key1  key2
    #   sdiff  key1  key2
    #            sismember key value
    #        scard key
    #          srandmember key
    

    redisにおける秩序化集合zset関連操作
    #  zadd key score member              :
    #    zrange key start stop
    #    zrevrange key start stop
    127.0.0.1:6379> zadd nset 100 z  50 a  1 h
    (integer) 3
    127.0.0.1:6379> type nset
    zset
    127.0.0.1:6379> zrange nset 0 -1
    1) "h"
    2) "a"
    3) "z"
    127.0.0.1:6379> zrevrange nset 0 -1
    1) "z"
    2) "a"
    3) "h"
    #  zrem key member
    #               zrank key member
    #               zrevrank key member
    127.0.0.1:6379> zrevrank nset z
    (integer) 0
    127.0.0.1:6379> zrank nset z
    (integer) 2
    #      zcard key
    127.0.0.1:6379> zcard nset
    (integer) 3
    #          zscore key member
    127.0.0.1:6379> zscore nset z
    "100"
    #     (    )          zcount key  min  max
    127.0.0.1:6379> zcount nset 1 50
    (integer) 2
    

    Redisのパブリケーションとサブスクリプション
    メッセージのパブリケーションは、通常、同じサーバ上の複数のユーザに対して行われる.例えば、3人のユーザが同時にxshellを介して同じサーバをリモートで開くredisユーザは、他のユーザがこのチャネルでpublishをパブリッシュするメッセージを受信するためにsubscribeチャネル番号を購読する必要があり、購読側はリアルタイムでメッセージを受信する
    #    aaa
    127.0.0.1:6379> subscribe aaa
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "aaa"
    3) (integer) 1
    #         
    127.0.0.1:6379> publish aaa  hi
    (integer) 1
    #         
    127.0.0.1:6379> subscribe aaa
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "aaa"
    3) (integer) 1
    1) "message"
    2) "aaa"
    3) "hi"
    #     unsubscribe    
    

    python呼び出しredis
  • redisパスワード制限操作の設定
  • #      
    pyvip@vip:~$ sudo vim /etc/redis/redis.conf 
    [sudo] password for pyvip: 
    396 # requirepass foobared
    397 requirepass allan
    #    
     pyvip@vip:~$ sudo service redis-server restart 
    #  redis   key              
    127.0.0.1:6379> set nn b
    (error) NOAUTH Authentication required.
    #      
    127.0.0.1:6379> auth allan
    OK
    
  • python呼び出し
  • #            
    pyvip@vip:~$ sudo vim /etc/redis/redis.conf 
     69 # bind 127.0.0.1
     70 bind 0.0.0.0
    #    
     pyvip@vip:~$ sudo service redis-server restart 
    #      redis,   py3en      
    (py3env) pyvip@vip:~$ pip install redis
    
  • pychamの項目で設定し、vmwork stationでポート転送を設定し、仮想マシンの6379ポートを4567に転送します.pythonがリモート仮想マシン環境を使用している場合はポート転送を必要としません
  • #python  
    #    
    import redis
    #    ,  localhost,  6379
    r = redis.Redis(host='localhost',port=6379)
    #    key=aaaaa,value=hello world
    r.set('aaaaa','hello world')
    #  key  value
    print(r.get('aaaaa'))
    #python           value 
    b'hello world'
    #          redis  key     
    127.0.0.1:6379> get aaaaa
    "hello world"
    #python      byte ,      
    r.set('hello','  ')
    print(r.get('hello'))
    #  b'\xe4\xbd\xa0\xe5\xa5\xbd'
    #       
    print(r.get('hello').decode('utf-8'))
    #