redis数据库的使用
redis数据库使用
django中使用redis要先进行配置,详情看:https://blog.youkuaiyun.com/paul0926/article/details/90725827
非关系型数据库,数据存储格式是键值结构,值得部分可分为5种:
- 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)
修改密码和登录
修改密码:
1.找到redis配置信息文件,如/etc/redis.conf
2.找到 # requirepass foobared. 并去掉注释,后面的foobared改成你的密码。如:requirepass my_redis
3.重启redis, sudo service redid restart.(或者这样重启:sudo service redid restart, sudo redis-server /etc/redis.conf)
登录:
1.如果直接 redis-cli. 登陆,没密码,那么你能登陆,但无任何操作权限
2.用密码登陆。redis-cli -h 127.0.0.1 -p 6379 -a my_redis. 才能有权限操作
3.先redis-cli登陆,此时没有操作权限,再输入:AUTH your_password. 同样可以完成认证
redis基本操作
redis基本操作(终端):
命令 含义
- del key 删除key
- keys * 所有键
- get name 获取name这个键的值
- del name 删除name
- set name “wuanger” 创建“wuanger”,键为name
- select 2 表示切换到2库,注:Django的cache是存在1库的(上面设置的),进入redis的时候默认是0库的
- TTL name 查看剩余过期时间
- EXPIRE name 300 设置name的过期时间为300秒
- type name 查看name的属性(总共:string, list, hash, set,zset)
string语法格式
创建:set key value:key是唯一的,不存在就创建,存在则覆盖
(django_py3) python@ubuntu:~/Desktop/shanghuishop/shanghuishop$ redis-cli
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> set name xiaoming
OK
127.0.0.1:6379> keys *
1) "name"
2) ":1:django.contrib.sessions.cache3hly23rlbdca4zoerfls1z2uusyc09zw"
127.0.0.1:6379> get name
"xiaoming"
删除:del key删除指定的键名
127.0.0.1:6379> del name
(integer) 1
设置带有过期时间的:setex key time value时间单位为秒
127.0.0.1:6379> setex name 15 tom
OK
127.0.0.1:6379> keys *
1) "name"
设置多个键值对:mset key1 value1 key2 value2
给对应键值追加内容:append key value
一次获取多个值:mget key1 key2
删除当前数据库:flushdb
删除所有数据库:flushall
list语法格式
左插入:lpush 列表名 值1 值2 …
左插入意思是每个值都是往左边插入,即与我们输入的值顺序相反
下面插入实际上列表顺序为:java c++ python
127.0.0.1:6379> lpush project python c++ java
(integer) 3
127.0.0.1:6379> lrange project 0 1
1) "java"
2) "c++"
右插入:rpush插入内容,插入顺序和显示顺序一致,显示所有为:
lrange project 0 -1
追加内容:linsert 列表名 before(after)
127.0.0.1:6379> linsert project before c++ php
(integer) 4
hash 哈希(类似于python的字典)
操作 含义
- hset hash_name key1 val1 hash_name = {key1: val1}
- hmset hash_name key1 val1 key2 val2 hash_name = {key1: val1, key2:
val2} - hget hash_name key1 获取key1
- hmget hash_name key1 key2 获取多个key
- hgetall hash_name 获取所有key
- hkeys hash_name 获取所有的key
- hvals hash_name 获取所有的val
- hdel hash_name key 删除hash_name中的key
set 集合(存储不重复的值,无序)
操作 含义
- sadd set1 val1 val2 添加一个set1集合里的值val1,val2
- srem set1 val1 从set1中移除val1
- smembers set1 set1的成员
- sismember set1 val1 查看val1是否在set1里,是返回1,否返回0
- sinter set1 set2 求交集
- sunion set1 set2 求并集
- sdiff set1 set2 求差集
zset(有序集合)
操作 含义
- zadd zset1 score member 创建、添加一个zset1,member的分数是score(int)
- zrangebyscore zset1 0 100
- withscores 得出zset1中分数score在0-100的member,score从小到大,后面的withscores是带score输出
- zrevrangebyscore zset1 100 0 从大到小输出
- zrange zset1 2 4 获取zset1中序号为3,4的member
- zrank zset1 a zset1中成员a的序号
- zrem zset1 a 移除zset1中的a
- zcount zset1 1 6 获取score为1-6之间的member数量
redis和python的交互
推荐使用redis包或者django_redis生成一个可操作对象,然后进行操作,语法就是上面的。
用redis包
from redis import StrictRedis
# 创建redis对象,设置数据库
sr = StrictRedis(host='localhost', port=6379, db=12)
# 2.要保存验证码上的文字部分,key为uuid,值为text,第三个参数是保存时间单位为秒
sr.set(uuid, text, 60)
使用pipe管道,意思是最后一起执行操作
# 3.生成短信验证码
msg = '%04d' % random.randint(0, 9999)
# 4.保存短信验证码到redis
conn = StrictRedis(host='localhost', port=6379, db=12)
# pipe管道,最后一起执行
pipe = conn.pipeline()
pipe.setex('%s_code' % phone, constants.PHONE_CODE_REDIS_EXPIRES, msg)
pipe.setex('%s_flag' % phone, constants.PHONE_FLAG_REDIS_EXPIRES, 1)
pipe.execute()
用django_redis包
# 在python中导入包
from django_redis import get_redis_connection
# 创建一个用于操作的对象,这个参数是指定设置的数据库,在设置文件里的
con = get_redis_connection('validate')
# 通过con可以对redis数据库进行增删改查的操作。
# 如插入、查询列表:
con.lpush('user', '赵四')
# con.setex(key, value, time)# 这个是设置过期时间
res = con.lrange('user', 0, -1)
这是在serializers.py文件里的验证方法里使用redis:
uuid = attrs['uuid']
# 创建redis对象,与数据库对比
redis_con_obj = get_redis_connection('validate')
# 取出文字,UUIDFiled为uuid类型,redis取出为bytes类型
img_text = redis_con_obj.get('%s' % uuid)
print(img_text, '222222222222')
if not img_text:
log.error('本地没有对应图片验证码')
raise serializers.ValidationError('本地没有对应图片验证码')
cache方法
from django.core.cache import cache
# read cache user id
def read_from_cache(self, user_name):
key = 'user_id_of_' + user_name
value = cache.get(key)
if value == None:
data = None
else:
data = json.loads(value)
return data
# write cache user id
def write_to_cache(self, user_name):
key = 'user_id_of_' + user_name
cache.set(key, json.dumps(user_name), settings.NEVER_REDIS_TIMEOUT)
restful
放版本号,不要放动词