Redis数据库
1、redis概念
redis是一个key-value存储系统。和memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
2、redis应用案例
1)微博大v的微博数据被存放于高速缓存中,普通人的微博存放于普通nosql数据库里
2)门户网站、电商网站、视频网站首页的内容都需要缓存(属于热数据)
3)双十一购物狂欢节,电商平台要利用高速的缓存来弥补数据库吞吐能力不足。订单先被缓存,然后负载低谷期,再写入数据库
4)电商平台秒杀/抢购业务需要用高速缓存来实现顺序操作-(解决支付的时候才提醒库存不足的问题)(单线程-栈队)
5)可以存放短时间内的数据(如验证码)
3、redis的目录结构
-
rdb:定期将内存中的数据保存在硬盘中,可以查看第一个文件,里面相关内容设置每隔一段时间将数据保存到硬盘中
-
aof:日志方式记录redis数据写入,意外宕机,重新执行aof日志就可以恢复数据,解决的rdb不能实时持久化的问题
-
都需要在配置文件中设置
4、redis常用的数据结构
1)字符串类型
-
-
string类型既可以保存普通文字,也可以保存序列化的二进制数据
-
string类型最大可以存储512m数据(set/get/del)
-
-
set/get/del 设置/获取/删除
-
getrange:获得截取字符串内容-》eg:getrange username 0 3----起始,结束位置
-
strlen:获得字符串长度 -》eg:strlen username
-
setex:设置带有过期时间(秒)的key-value-》eg:setex city 10 beijing(秒杀活动的数据)
-
mset:设置多个key-value -》eg:mset username charisse age 18
-
mget:获得多个value -》eg:mget username age
-
append:用于在字符串结尾追加内容 -》eg:append username abcd
-
incr:数字自增加1 -》eg:incr num
-
incrby:数字加上指定的整数值 -》eg:incrby num 25
-
incrbyflaot:数字加上指定的浮点数 -》eg:incrbyfloat num 2.5/incrbyfloat age -2.5
-
decr:数字自减1 -》eg:decr age
-
decrby:数字减去指定的整数值 -》eg:decrby age 5
-
-
2)redis哈希类型
-
-
当我们觉得value需要保存更复杂的结构化数据,这时可以使用哈希类型
- 哈希指令之后紧跟数字
-
-
-
哈希指令:
-
hset:设置哈希表字段 -》eg:hset 1001 username tom
-
hmset:设置哈希表多个字段 -》eg:hmset 1001 username tom job salse
-
hget:获取哈希表字段值 -》eg:hget 1001 username
-
hmget:获取多个哈希表字段的值 -》eg:hmget 1001 username job
-
hgetall:获取所有哈希表字段值 -》eg:hgetall 1001
-
hkeys:获取所有哈希表字段名 -》eg:hkeys 1001
-
hlen:获取哈希表中的字段数量 -》eg:hlen 1001
-
hexists:判断哈希表是否存在某个字段 -》eg:hexists 1001 job
-
hvals:获取哈希表的所有字段值 -》eg:hvals 1001
-
hdel:删除哈希表的字段 -》eg:hdel 1001 username job
-
hincrby:让哈希表某个字段值加上指定的整数值 -》eg:hincrby 1001 age 10【-10】
-
hincrbyfloat:让哈希表某个字段值加上指定的浮点数 -》eg:hincrbyfloat 1001 price 3.5
-
-
-
-
当我们需要向value保存序列化的数据,可以使用列表类型
-
列表指令
-
rpush:在列表的右侧添加元素 -》eg:rpush hobby music draw dance
-
lpush:在列表的左侧添加元素 -》eg:lpush hobby basketball
-
lset:修改列表中的元素 -》lset hobby 2 足球 | lset 列表名 索引值 修改值
-
lrange:输出列表元素 -》lrange hobby 0 -1(全部)
-
llen:获取列表长度 -》eg:llen hobby
-
lindex:获取列表某个元素 -》eg:lindex hobby 0
-
linsert:在某个位置插入元素 -》eg:linsert hobby before/after draw game
-
lpop:删除列表最左边的元素 -》eg:lpop hobby
-
rpop:删除列表最右边的元素 -》eg:rpop hobby
-
lrem:删除列表某个元素 -》eg:lrem hobby 1 draw (1把第一个draw 删掉,2把两个全删掉)
-
-
4)redis集合类型
-
-
如果我们需要列表的元素不可以重复,可以使用集合类型,元素不可重复(根据哈希值比较和排序)--顺序和插入顺序无关
-
集合指令
-
sadd :定义集合 -》eg:sadd empno 8000
-
smembers:查看集合所有元素 -》eg:smembers empno
-
flushall:清空逻辑空间
-
scard:获得集合长度 -》eg:scard empno
-
sismember:判断是否含有某个元素 -》sismember empno 8000
-
srem:删除元素 -》eg:srem empno 8000 8800 (del 可以删除任何类型)
-
spop:随机删除并返回集合的某个元素 -》eg:spop empno
-
srandmember:随机返回集合中的几个元素 -》eg:srandmember empno 5
-
-
5)redis有序集合
-
-
有序集合是带有排序功能的集合,redis会按照元素分数值排序
-
有序集合指令
-
zadd:创建有序集合 -》eg:zadd keword 0 “鹿晗” 0 “马云” 0 “张朝阳”
-
zincrby:分数值+1 -》eg:zincrby keyword 5 "马云"
-
zrevrange:降序查看全部元素 -》eg:zrevrange keyword 0 -1
-
zcard:获得有序集合长度 -》eg:zcard keyword
-
zcount:查询某个分数值间内的元素数量 -》eg:zcount keyword 5 10
-
zscore:返回元素的分数值 -》eg:zscore keyword “马云”
-
zrange:获得有序集合的内容(升序)-》eg:zrange keyword 0 -1
-
zrevrange:获得有序集合的内容(降序)-》eg:zrevrange keyword 0 -1/zrevrange keyword 0 0(最高分)
-
zrangebyscore:获取分数值区间内的集合内容(升序)
zrangebyscore keyword 5 10 大于等于5,小于等于10
zrangebyscore keyword 5 (10 大于等于5,小于10
zrangebyscore keyword 100000 +inf 十万以上 -
zrevrangebyscore:获取分数值区间内的集合内容(降序)-》eg:zrevrangebyscore keyword 10 5
-
zrank:获得元素的升序排名(从0开始)-》eg:zrank keyword “马云”
-
zrevrank:获得元素的降序排名(从0开始)-》eg:zrevrank keyword “马云”
-
zrem:删除有序集合中的元素 -》eg:zrevm keyword ‘’马云‘’ “张朝阳”
-
zremrangebyrank:删除排名区间内的元素 -》eg:zremrangebyrank keyword 0 2
-
zremrangebyscore:删除分数区间内的元素 -》eg:zremrangebyscore keyword -inf (5000
-
-
5、redis常用命令
-
key命令
-
del:删除记录 -》eg:del keyword
-
exists:判断是否存在某个key -》eg:exists employee
-
exipire:设置记录过期时间 -》eg:expire employee 5(秒)
-
expireat:设置记录的过期时间(unix时间戳)-》eg:expireat employee 1544803200
-
rename:修改key名称 -》eg:rename employee emp
-
persist:移除过期时间 -》eg:persist employee
-
type:判断value的数据类型 -》eg:type employee
-
相关redis命令可查看官方文档:
6、redis与python交互
1)安装
在命令行安装即可:pip install redis
2)连接
import redis r = redis.redis( host="localhost", port=6379, password="", db=0 )
3)操作指令
上面提到的5种数据结构,在redis中很相似的,在python中也一样,这里仅介绍几种
a、设置和获取
r.set("country","英国") r.set("city","伦敦") city = r.get("city").decode("utf-8") print(city)
b、设置多个变量和删除
r.delete("country","city") r.mset({"country":"德国","city":"柏林"}) result = r.mget("country","city") for one in result: print(one.decode("utf-8"))
c、列表增加和删除
r.rpush("dname","董事会","秘书处","财务部","技术部") r.lpop("dname") result = r.lrange("dname",0,-1) for one in result: print(one.decode("utf-8"))
d、集合增加和删除
r.sadd("employee",8000,8001,8002) r.srem("employee",8001) result = r.smembers("employee") r.zadd("keyword",{"马云":0,"邓磊":0,"张朝阳":0}) r.zincrby("keyword","10","马云") result = r.zrevrange("keyword",0,-1)
e、哈希增加和删除
try: r.hmset("9527",{"name":"charisse","age":"18","sec":"male"}) r.hset("9527","city","北京") r.hdel("9527","age") r.hexists("9527","name") result = r.hgetall("9527")# 字典 for one in result: print(one.decode("utf-8"),result[one].decode("utf-8")) except exception as e: print(e) finally: del r