redis是一个key-value存储系统,为了保证效率,数据都是缓存在内存中。它支持存储的value类型很多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set 有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove,取交集并集和差集,以及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。而且redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
redis库安装:pip install Redis
简单示例:
# 打开win7 下redis-cli.exe 进入redis cli 窗口
> set name abc # 给变量name设置值abc
OK
> set age 25
OK
> keys * # 列出当前所有key,变量是key-value对
1) "age"
2) "name"
> set sex m ex 5 # 给变量sex设置值m,并且设置这个变量只存活5秒
OK
> get sex # 获取变量的值
"m"
> flushdb # 清空当前db下的所有键值
OK
> flushall # 清空所有db下的键值
OK
set
在Redis中设置值,默认,不存在则创建,存在则修改
参数:
ex,过期时间(秒)
px,过期时间(毫秒)
nx,如果设置为True,则只有name不存在时,当前set操作才执行
xx,如果设置为True,则只有name存在时,当前set操作才执行
批量设置值:mset(*args, **kwargs)
mset 批量设置值,MSET key value [key value …]
示例:mset name1 Zhou name2 wen
mget(keys, *args)
批量获取:mget name1 name2
getset(name, value)
设置新值并获取原来的值: getset name1 Qi
getrange(name, start, end)
获取子序列(根据字节获取,非字符)
name:Redis 的 key,变量名
start:起始位置(字节)
end:结束位置(字节)
从0开始计数,前后闭包
>set name Zhou
> getrange name 23>"ou"
setrange(name, offset, value)
修改字符串内容,从指定字符串索引开始向后替换(如果新值太长时,则向后添加)
offset,字符串的索引,字节(一个汉字三个字节)
value,要设置的值
>set name Zhou
> setrange name 1 we
> get name
"Zweu"
setbit(name, offset, value)
对name对应值的二进制进行位操作。
name:redis的key,变量
offset:位的索引(将值变换成二进制后再进行索引)
value:值只能是 1 或 0>set name abcd # 我们对值内a进行修改
OK
> setbit name 61(integer)0> get name
"cbcd"# 改b的话,从第8位开始数----------------------------------------------# python IDE下>>>ord('a')97>>>bin(97)# 把a改成c,97 ——> 99'0b1100001'# 0110 0001 ——> 0110 0011 (第6位改为1)----------------------------------------------# setbit还有个特性,不会溢出,超出的部分会自动增长> setbit name a
> setbit name 101# 虽然a一个字节只有8位,但是这里没有限制。(integer)0> setbit name 111(integer)0> get name
"a0"
bitcount(key, start=None, end=None)
获取变量key对应的值的二进制表示中 1 的个数
>set name a # a ——> 0110 0001
OK
> bitcount name # 3个1(integer)3
一般在存储用户时,每个用户都有一个大整数ID,ID是唯一的。那么我们可以分配出一个大空间(大字符串),按位标记,在线则标记对应的bit位为1,不在线则为0,最后用bitcount计算在线用户数量。计算一下,按位来存,2亿用户,只占用2亿个位空间。
> setbit user 10001# 假如用户ID 1000登录> setbit user 271> setbit user 60001> bitcount user # 查看在线用户(integer)3> getbit user 27# 查看用户在不在线,1说明用户在线(integer)1> getbit user 28# 0 说明用户不在线(integer)0
name对应的hash中设置一个键值对(不存在,则创建;否则,修改)
# name,redis的name,也就是变量# key,变量name对应的hash中的key# value,变量name对应的hash中的value# 注:hsetnx(name, key, value),当name对应的hash中不存在当前key时则创建(相当于添加)> hset user1 name zhou
(integer)1> hset user age 28(integer)1> hgetall user # 查看user对应hash下所有key和value1)"name"2)"zhou"3)"age"4)"28"> hkeys user # 查看user对应hash下所有key1)"name"2)"age"> hvals user # 查看user对应hash下所有value1)"zhou"2)"28"
hmset(name, mapping)
*hmget(name, keys, args)
hlen(name)
hmset:在变量name对应的hash中批量设置键值对
hmget:在name对应的hash中获取多个key的值
hlen:获取name对应的hash中键值对的个数
# name,redis的name# mapping,字典形式,如:{'k1':'v1', 'k2': 'v2'}> hmset user name zhou age 2> hmget user name age
1)"zhou"2)"2"> hlen(user)(integer)2
hexists(name, key)
检查name对应的hash是否存在当前传入的key
> hexists user name
(integer)1> hexists user sex
(integer)0
hdel(name,*keys):将name对应的hash中指定key的键值对删除
hincrby(name, key, amount=1)
类似的:hincrbyfloat(name, key, amount=1.0)
自增name对应的hash中的指定key的值,不存在则创建key=amount
name,redis中的name
key, hash对应的key
amount,自增数(整数)
> hincrby user grade 1(integer)1> hincrby user grade 1(integer)2
hscan(name, cursor=0, match=None, count=None) 过滤
增量式迭代获取,对于数据大的数据非常有用,hscan可以实现分片的获取数据,
并非一次性将数据全部获取完,从而放置内存被撑爆
# name,redis的name# cursor,游标(基于游标分批取获取数据)# match,匹配指定key,默认None 表示所有的key# count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数> hscan user 0 match a*# *代表泛匹配1)"0"2)1)"age"2)"28"
在name对应的列表的某一个值前或后插入一个新值
# name,redis的name# where,BEFORE或AFTER# refvalue,标杆值,即:在它前后插入数据# value,要插入的数据> linsert nameLst before C D
(integer)7> lrange nameLst 4-11)"B"2)"D"3)"C"