学习《Flask Web全栈开发实战》第8章 缓存系统总结.主要是数据类型添加、删除数据的命令总结。包括列表操作,集合操作,哈希操作。不能不学,但是学习了相关命令,目前没有觉得用处有多大。在项目里的用处也不大。
8.2 Redis
windows的redis相关操作
windows系统,命令行终端输入redis-cli进入Redis命令行 连接本机的redis-server命令 redis-cli -h 127.0.0.1 -p 6379
redis操作命令
1.添加数据
set key value EX timeout
示例
set username zhiliao EX 60
2.删除数据
del key
示例
del username
3.设置过期时间
expire key timeout(单位为秒)
示例
expire username 60
4.查看过期时间
ttl key
示例命令
ttl username
5.查看所有key
keys *
6.列表操作
将value插向key所指向的列表的最开始位置。如果key不存在,创建一个空的列表,并且执行lpush操作。
lpush key value
将value插向key所指向的列表的末尾位置。如果key不存在,创建一个空的列表,并且执行lpush操作。
rpush key value
查看列表里面所有元素
lrange key 0 -1
移除并返回列表左边的元素,语法
lpop key
移除并返回列表右边的元素,语法
rpop key
移除并返回列表中的指定元素
lrem key count value
删除列表key中count个值为value的元素。count>0,从左到右删除。count<0,从右到左删除。count=0,移除列表中所有与value相等的值。
lrem key count value
7、集合操作
一次性可以添加多个值
sadd key value1 value2...
查看元素
smembers key
通过srem命令一次性删除多个元素
srem key value1 value2
查看集合元素个数
scard key
获取多个集合的交集
sinter key1 key2...
sdiff key1 key2...
8、哈希操作
添加新值
hset key field value
示例
hset website baidu baidu.com
获取哈希表中field的值
hget key field
删除某个field
hdel key field
获取某张哈希表中所有的fields,语法如下
hkeys key
获取某张哈希表中所有的值,语法如下
hvals key
判断哈希表中是否存在某个field,语法如下
hexists key field
9、事务操作
开启一个事务
multi
命令1
命令2
命令3
...
执行事务
exec
取消事务
discard
watch key1 key2...
取消所有key的监视,语法
unwatch
10.发布、订阅操作
给某个频道发布消息
publish channel message
订阅某个频道
subscribe channel
项目中使用redis
在config.py做如下配置
CACHE_TYPE = "RedisCache"
CACHE_REDIS_HOST = "127.0.0.1"
CACHE_REDIS_PROT = 6379
CACHE_REDIS_DB = 0
CACHE_REDIS_PASSWORD = '1111'
# Celery配置
# 格式redis://:password@host-name:port/db_number
CELERY_BROKER_URL = "redis://:1111@127.0.0.1:6379/0"
CELERY_RESULT_BACKEND = "redis://:1111@127.0.0.1:6379/0"
exts1.py
from flask_avatars import Avatars
from flask_login import LoginManager
from flask_sqlalchemy import SQLAlchemy
from flask_mail import Mail
from flask_caching import Cache
from flask_wtf import CSRFProtect
db = SQLAlchemy()
mail = Mail()
avatars = Avatars()
#创建一个Flask-Caching对象
cache = Cache()
csrf = CSRFProtect()
app.py代码
app = Flask(__name__)
...
cache.init_app(app)
在blueprints/user.py导入cache对象
@bp.route("/email/captcha",methods=['POST','GET'])
def get_captcha():
# email = request.form.get("email")
try:
email = request.args.get("email")
letters = string.ascii_letters + string.digits
captcha = "".join(random.sample(letters,4))
subject="【小风论坛】邮箱测试"
body = f"【小风论坛】您的验证码是{captcha},请不要告诉任何人"
# message = Message(subject="邮箱测试",recipients=[email],body = f"您的验证码是{captcha},请不要告诉任何人"
# )
# mail.send(message)
current_app.celery.send_task("send_mail",(email,subject,body))
cache.set(email,captcha,timeout=100)
return restful.ok()
except Exception as e:
print(e)
return restful.server_error()
forms.py
class RegisterForm(BaseForm):
username = StringField(validators=[length(min=3,max=20)])
email = StringField(validators=[email(message="请输入正确格式的邮箱")])
captcha = StringField(validators=[length(min=4,max=4,message="请输入正确长度的验证码")])
password = StringField(validators=[length(min=6,max=20,message="请输入正确长度的用户名")])
password_confirm = StringField(validators=[EqualTo("password",message="两次密码长度不一致")])
def validate_email(self, field):
email = field.data
user_model = UserModel.query.filter_by(email=email).first()
if user_model:
raise ValidationError("邮箱已经存在!")
# 必须定义一个方法才能够去验证,validate_后面加上你要验证的
def validate_captcha(self, field):
captcha = field.data
email = self.email.data
cache_captcha = cache.get(email)
# captcha_model = EmailCaptchedModel.query.filter_by(email = email).first()
if not cache_captcha or captcha != cache_captcha:
raise ValidationError("邮箱或者验证码错误")