python-redisの最も詳細な操作

24453 ワード

1、インストール
1.1インストール
sudo apt-get install redis-server

1.2サービス側起動
sudo /etc/init.d/redis-server status | start | stop | restart

1.3クライアント接続
redis-cli -h IP   -p   
redis-cli #        6379  
127.0.0.1:6379>ping
PONG

2、常用コマンド
#    
select number
#    
keys * 
#    
TYPE key
#      
exists key
#    
del key
#     
rename key newkey
#          (      ,      )
getset key value
#           (  )
flushdb
#           (  )
flushall

1.     key-value
set key value
2.   key  
get key
3. key         (nx)
set key value nx
4.       (ex)
set key value ex seconds
5.       key-value
mset key1 value1 key2 value2 key3 value3
6.       key-value
mget key1 key2 key3 

3、整数操作
INCRBY key   
DECRBY key   
INCR key : +1  
DECR key : -1  
#     :          ,      INCR ,             DECR

#      :        ,        ,    append
incrbyfloat key step

4、リスト
4、リストの共通操作
#  
1、LPUSH key value1 value2 
2、RPUSH key value1 value2
3、RPOPLPUSH source destination
4、LINSERT key after|before value newvalue
#  
5、LRANGE key start stop
6、LLEN key
#  
7、LPOP key
8、RPOP key
9、BLPOP key timeout
10、BRPOP key timeout
11、LREM key count value
12、LTRIM key start stop
#  
13、LSET key index newvalue

4.2 python使用
import redis
r = redis.Redis(host='192.168.43.49',port=6379,db=0)
# ['mysql','redis']
r.lpush('pylist','redis','mysql')
# ['mysql','redis','django','spider']
r.rpush('pylist','django','spider')
# ['mysql','redis','django','spider','AI']
r.linsert('pylist','after','spider','AI')
# 5
print(r.llen('pylist'))
# ['redis','django','spider']
r.lpop('pylist')
r.rpop('pylist')
# ['redis','django','spider']
print(r.lrange('pylist',0,-1))
# ['redis','spider']
r.lrem('pylist',0,'django')
#   True,['redis']
r.ltrim('pylist',0,0)
#   True,['spiderman']
r.lset('pylist',0,'spiderman')
r.delete('pylist')

5、文字列コードの例
import redis
r = redis.Redis(host='192.168.43.49',port=6379,db=0)
r.set('mystring','python')
# b'python'
print(r.get('mystring'))
# False
print(r.setnx('mystring','socket'))
# mset:     
r.mset({'mystring2':'mysql','mystring3':'mongodb'})
# mget:       
print(r.mget('mystring','mystring2','mystring3'))
# mystring  :6
print(r.strlen('mystring'))
#       
r.set('number',10)
r.incrby('number',5)
r.decrby('number',5)
r.incr('number')
r.decr('number')
r.incrbyfloat('number',6.66)
r.incrbyfloat('number',-6.66)
# b'10'
print(r.get('number'))

6、Hashハッシュ
6.1基本命令操作
# 1、      
HSET key field value
HSETNX key field value
# 2、      
HMSET key field value field value
# 3、      
HLEN key
# 4、        (     0)
HEXISTS key field
# 5、     
HGET key field
# 6、       
HMGET key field filed
# 7、        
HGETALL key
# 8、       
HKEYS key
# 9、     
HVALS key
# 10、      
HDEL key field 
# 11、               
HINCRBY key filed increment
# 12、                
HINCRBYFLOAT key field increment

6.2 phthon基本方法
# 1、         ,     
hset(name, key, value)
# 2、           ,        
hget(name, key)
# 3、      (     )  ,     
hmset(name, mapping)
# 4、      (     )  
hmget(name, keys)
# 5、                ,      
hgetall(name)
# 6、            ,      
hkeys(name)
# 7、           
hdel(name, *keys)

7、集合
7.1特徴
1、  、  
232^32-1   

7.2基本命令
# 1、          ,    
SADD key member1 member2
# 2、         
SMEMBERS key
# 3、          ,         
SREM key member1 member2
# 4、      
SISMEMBER key member
# 5、              ,   1 
SRANDOMMEMBER key [count]
# 6、          ,        ,         
SCARD key
# 7、              
SMOVE source destination member
# 8、  (number1 1 2 3 number2 1 2 4)
SDIFF key1 key2 
# 9、           
SDIFFSTORE destination key1 key2
# 10、  
SINTER key1 key2
SINTERSTORE destination key1 key2
# 11、  
SUNION key1 key2
SUNIONSTORE destination key1 key2

7.3 python操作set
# 1、 name          
sadd(name,values)
r.sadd("set_name","tom")
r.sadd("set_name","tom","jim")

# 2、  name          :   
smembers(name)

# 3、  name           
scard(name)
r.scard("set_name")

# 4、  value   name         :True|False
sismember(name, value)

# 5、                
spop(name)

# 6、          
srem(name, value) 
r.srem("set_name", "tom")

# 7、    name       
sinter(keys, *args)

r.sadd("set_name","a","b")
r.sadd("set_name1","b","c")
r.sadd("set_name2","b","c","d")

print(r.sinter("set_name","set_name1","set_name2"))
#  :{b'b'}

# 8、    name        
sunion(keys, *args)
r.sunion("set_name","set_name1","set_name2")

8、秩序ある集合
8.1 python操作sorted set
import redis
r = redis.Redis(host='192.168.43.49',port=6379,password='123456',db=0)
#           
r.zadd('salary',{'tom':6000,'jim':8000,'jack':12000})
#           [(),(),()]
print(r.zrange('salary',0,-1,withscores=True))
print(r.zrevrange('salary',0,-1,withscores=True))
# start:   ,num:    
print(r.zrangebyscore('salary',6000,12000,start=1,num=2,withscores=True))
#   
r.zrem('salary','tom')
print(r.zrange('salary',0,-1,withscores=True))
#     
r.zincrby('salary',5000,'jack')
print(r.zrange('salary',0,-1,withscores=True))
#       
print(r.zrank('salary','jack'))
print(r.zrevrank('salary','jack'))
#           
r.zremrangebyscore('salary',6000,8000)
print(r.zrange('salary',0,-1,withscores=True))
#       
print(r.zcard('salary'))
#            
print(r.zcount('salary',6000,20000))
#   
r.zadd('salary2',{'jack':17000,'lucy':8000})
r.zunionstore('salary3',('salary','salary2'),aggregate='max')
print(r.zrange('salary3',0,-1,withscores=True))
#   
r.zinterstore('salary4',('salary','salary2'),aggregate='max')
print(r.zrange('salary4',0,-1,withscores=True))

9、データ持続化
9.1サーバはクライアントから送信されたSAVEまたはBGSAVEコマンドを実行する
127.0.0.1:6379> SAVE
OK
#   
1、  SAVE     ,redis       ,              , SAVE       ,                     
2、  RDB      ,            RDB      RDB  
#               

127.0.0.1:6379> BGSAVE
Background saving started
#       
1、       BGSAVE     
2、        Background saving started     
3、    fork()         
45、      RDB      Redis   

#         
/etc/redis/redis.conf
263 : dir /var/lib/redis #   rdb      
253 : dbfilename dump.rdb  #    

9.1設定ファイルの条件が満たされた場合に自動的に保存する(最大使用)
#      
redis>save 300 10
             RDB       30010   ,      BGSAVE  
redis>save 60 10000
             rdb      6010000   ,    bgsave  

# redis      
218 : save 900 1
219 : save 300 10
220 : save 60 10000
  1、                ,         BGSAVE
  2、    RDB    ,                               ,       ,               

9.3データ永続化区分-AOF(AppendOnlyFile、デフォルトはオン)
9.3.1特徴
1、      ,       
2#     (      )
1/etc/redis/redis.conf
  672 : appendonly yes #   no    yes
  676 : appendfilename "appendonly.aof"
2、    
  sudo /etc/init.d/redis-server restart

9.3.2 RDB欠点
1、  RDB                      ,                ,                   RDB  ,    ,  RDB           ,             
2

9.3.3 AOF持続化の原理と利点**
#   
   1、               ,              AOF     
   2、  AOF                        ,      AOF  ,           AOF           ,             

#   
              AOF       , Redis               ,           ,  RDB            

10、主従レプリケーション
10.1定義
1、  Redis              ,  Redis    master,       slaves
2、master              slaves,      
3、  master       ,slave       

10.2実現方式
10.2.1方式一(コマンドライン実装1)
   redis-server --slaveof  
#     
redis-server --port 6300 --slaveof 127.0.0.1 6379
#     
redis-cli -p 6300
127.0.0.1:6300> keys * 
#        6379   redis   
127.0.0.1:6380> set mykey 123
(error) READONLY You can't write against a read only slave.
127.0.0.1:6380> 
#          ,     

10.2.2方式二(プロファイルの変更)
#       
vi redis_6300.conf
slaveof 127.0.0.1 6379
port 6300
#   redis  
redis-server redis_6300.conf
#        
redis-cli -p 6300
127.0.0.1:6300> hset user:1 username guods
(error) READONLY You can't write against a read only slave.

問題のまとめ
1、  Master     Slaves
2、Slave  ,            
3、Master  ,       
4、    Slave  SLAVEOF no one    Master,  Slaves  SLAVEOF        Master,        
#         ,      ,    Sentine  ,      Failover  

redis分散ロック
def test(request):
	#      :redis    
    import redis
    pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
    r = redis.Redis(connection_pool=pool)
    while True:
        try:
            with r.lock('guoxiaonao', blocking_timeout=3) as lock:
                u = UserProfile.objects.get(username='guoxiaonao')
                u.score += 1
                u.save()
            break
        except Exception as e:
            print('lock is failed')
    
    return HttpResponse('HI HI HI')