Redis string操作
一、和python交互
import redis r=redis.Redis(host='192.168.5.132', port=6379) r.set("foo","bar") print(r.get("age")) #连接池 #redis-py 使用connection pool来管理对一个resisserver的所有连接,避免每次建立、释放连接的开销,默认,每个redis实例都会维护一个自己的连接池,这样可以实现多个redis实例共享一个连接池。 import redis pool=redis.ConnectionPool(host="192.168.5.132",port=6379) r=redis.Redis(connection_pool=pool) print(r.get("name"))
二、操作
redis中的String在在内存中按照一个name对应一个value来存储。如图:
具体操作方式如下:
1、set(name, value, ex=None, px=None, nx=False, xx=False)
在Redis中设置值,默认,不存在则创建,存在则修改 参数: ex,过期时间(秒) px,过期时间(毫秒) nx,如果设置为True,则只有name不存在时,当前set操作才执行 xx,如果设置为True,则只有name存在时,岗前set操作才执行
redis命令操作:
127.0.0.1:6379> set age 22 #设置age为22 OK 127.0.0.1:6379> set age 22 ex 2 #设置age为22,过期时间为2秒 OK 127.0.0.1:6379> set age 23 OK 127.0.0.1:6379> set age 24 nx #当age的值已经存在,则无法重新设置新的值 (nil) 127.0.0.1:6379> get age "23" 127.0.0.1:6379> set age 24 xx #当age的值已经存在,则才能重新设置新的值 OK 127.0.0.1:6379> get age "24"
2、setnx(name, value)
设置值,只有name不存在时,执行设置操作(添加),相当于set name junesu nx
3、setex(name, time,value)
# 设置值 # 参数: # time,过期时间(数字秒 或 timedelta对象) #相当于 set name junesu ex 2
127.0.0.1:6379> setex sex 5 boy
OK
4、psetex(name, time_ms, value)
# 设置值 # 参数: # time_ms,过期时间(数字毫秒 或 timedelta对象) #相当于 set name susu px 2
5、mset(*args, **kwargs)
批量设置值 如: mset(k1='v1', k2='v2') 或 mget({'k1': 'v1', 'k2': 'v2'})
127.0.0.1:6379> mset a 1 b 2 c 3
OK
7、mget(keys, *args)
批量获取 如: mget('a', 'b') 或 r.mget(['a', 'b'])
8、getset(name, value)
设置新值并获取原来的值,没有就设置新值 127.0.0.1:6379[1]> set age 23 #设置age的值为23 OK 127.0.0.1:6379[1]> getset age 18 #重新设置age的值为18,并返回原来的值23 "23" 127.0.0.1:6379[1]> get age #获取age当前的值 "18"
9、getrange(key, start, end)
127.0.0.1:6379[1]> set name sujun OK 127.0.0.1:6379[1]> getrange name 0 1 #获取0到1的字符串,这边相当于切片,但是是顾头又顾尾 "su"
10、setrange(name, offset, value)
127.0.0.1:6379[1]> get name "junesu" 127.0.0.1:6379[1]> setrange name 3 s #把字符串中的第3个字符替换成m (integer) 10 127.0.0.1:6379[1]> get name "junssu"
11、setbit(name, offset, value)
# 参数: # name,redis的name # offset,位的索引(将值变换成二进制后再进行索引) # value,值只能是 1 或 0 # 注:如果在Redis中有一个对应: n1 = "foo", 那么字符串foo的二进制表示为:01100110 01101111 01101111 所以,如果执行 setbit('n1', 7, 1),则就会将第7位设置为1, 那么最终二进制则变成 01100111 01101111 01101111,即:"goo" # 扩展,转换二进制表示: # source = "武沛齐" source = "foo" for i in source: num = ord(i) print bin(num).replace('b','') 特别的,如果source是汉字 "武沛齐"怎么办? 答:对于utf-8,每一个汉字占 3 个字节,那么 "武沛齐" 则有 9个字节 对于汉字,for循环时候会按照 字节 迭代,那么在迭代时,将每一个字节转换 十进制数,然后再将十进制数转换成二进制 11100110 10101101 10100110 11100110 10110010 10011011 11101001 10111101 10010000
*用途举例,用最省空间的方式,存储在线用户数及分别是哪些用户在线
bitcount 统计二进制有多少个1 setbit n4 111 1 127.0.0.1:6379> setbit name 111 1 (integer) 0 127.0.0.1:6379> get name "junesu\x00\x00\x00\x00\x00\x00\x00\x01" 假如有2亿用户,有1亿在线 假如一个 ID1000用户,那么我就setbit n5 1000 1 ID555用户,那么我就setbit n5 555 1 在线用户数:bitcount n5 判断555用户在线: 127.0.0.1:6379> getbit n5 555 1
12、getbit(name, offset)
# 获取name对应的值的二进制表示中的某位的值 (0或1)
13、bitcount(key, start=None, end=None)
# 获取name对应的值的二进制表示中 1 的个数 # 参数: # key,Redis的name # start,位起始位置 # end,位结束位置
14、strlen(name)
# 返回name对应值的字节长度(一个汉字3个字节)
15、incr(self, name, amount=1)
# 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。 # 参数: # name,Redis的name # amount,自增数(必须是整数) # 注:同incrby 127.0.0.1:6379[1]> INCR user_name (integer) 1 127.0.0.1:6379[1]> INCR user_name (integer) 2 127.0.0.1:6379[1]> INCR user_name (integer) 3
*用途举例,这个一般用于计算用户的登录的总量的。
16、incrbyfloat(self, name, amount=1.0)
# 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。 # 参数: # name,Redis的name # amount,自增数(浮点型) 127.0.0.1:6379[1]> incrbyfloat user_login 1.2 "1.2" 127.0.0.1:6379[1]> incrbyfloat user_login 1.4 "2.6"
17、decr(self, name, amount=1)
127.0.0.1:6379> decr name
(integer) 7
127.0.0.1:6379> decr name
(integer) 6
127.0.0.1:6379> get name
"6"
127.0.0.1:6379>
*用途举例,用于如果用户账户失效,则减去
18、append(key, value)
127.0.0.1:6379[1]> get name "susu" 127.0.0.1:6379[1]> append name xiao #在name值后面追加xiao字符串 (integer) 14 127.0.0.1:6379[1]> get name "susuxiao"
19、help 变量名
#查看操作的使用方法 127.0.0.1:6379[1]> help set #help 命令 SET key value [EX seconds] [PX milliseconds] [NX|XX] #set命令的用法 summary: Set the string value of a key #作用 since: 1.0.0 group: string #所属类型,是string