python-redisの最も詳細な操作
1、インストール
1.1インストール
1.2サービス側起動
1.3クライアント接続
2、常用コマンド
3、整数操作
4、リスト
4、リストの共通操作
4.2 python使用
5、文字列コードの例
6、Hashハッシュ
6.1基本命令操作
6.2 phthon基本方法
7、集合
7.1特徴
7.2基本命令
7.3 python操作set
8、秩序ある集合
8.1 python操作sorted set
9、データ持続化
9.1サーバはクライアントから送信されたSAVEまたはBGSAVEコマンドを実行する
9.1設定ファイルの条件が満たされた場合に自動的に保存する(最大使用)
9.3データ永続化区分-AOF(AppendOnlyFile、デフォルトはオン)
9.3.1特徴
9.3.2 RDB欠点
9.3.3 AOF持続化の原理と利点**
10、主従レプリケーション
10.1定義
10.2実現方式
10.2.1方式一(コマンドライン実装1)
10.2.2方式二(プロファイルの変更)
問題のまとめ
redis分散ロック
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、 、
2、
3、 2^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()
4、
5、 RDB Redis
#
/etc/redis/redis.conf
263 : dir /var/lib/redis # rdb
253 : dbfilename dump.rdb #
9.1設定ファイルの条件が満たされた場合に自動的に保存する(最大使用)
#
redis>save 300 10
RDB 300 , 10 , BGSAVE
redis>save 60 10000
rdb 60 , 10000 , 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')