目录
redis与memcache
前端数据库: cookie, sessionStorage, localStorage
- redis支持的数据结构有: 字符串、列表、字典、无序集合、有序集合, 而memcache只支持字符串
- redis支持内存数据持久化和高并发, 而memcache不支持内存数据持久化且并发量小
redis基本操作
'''
1. 通过配置文件后台启动redis服务: redis-server --service-start /d/Redis/my_redis.conf
2. 连接redis服务: redis-cli -h localhost -p 6379 -n 数据库索引 -a 密码
3. 关闭redis服务: redis-cli shutdown
4. 切换数据库: select 数据库索引
5. 设置密码: config set requirepass 密码 # 重启redis服务后密码重置为 D:Redismy_redis.conf 中配置的密码
'''
redis数据持久化
-
数据丢失找回: 服务器关闭时默认会调用save将内存中的数据持久化保存到 dump.rdb 中, dump.rdb的位置可以在 D:Redismy_redis.conf 中进行修改
-
满足指定条件时周期性调用save将内存中的数据持久化保存到 dump.rdb 中, 可以在 D:Redismy_redis.conf 中修改条件和周期
-
主动调用save将内存中的数据持久化保存到 dump.rdb 中
redis的数据结构
String, Hash, List, Set, Sorted Set
redis的字符串操作
'''
mset a 1 b 2 c 3
mget a b c
setex age 3 18 # 设置age: 18的过期时间为3s
incrby age 10 # 将age的值增加10
append name xxx # 将xxx拼接到name值后面
'''
redis的列表操作
'''
rpush student Bob Tom # 创建students列表并添加列表值Bob, Tom
lrange students 0 -1 # 获取students列表中的所有值
llen students # 获取students列表中元素的个数
ltrim students 1 3 # 将students列表中索引为[1-3]之外的其他元素剪切
'''
redis的字典操作
'''
hmset people name cql age 25 # 创建people字典并添加键值对
hmset people gender male
hmset people age 26
hkeys people # 获取所有key
hvals people # 获取所有的value
hdel people gender
'''
redis的集合操作
'''
scard set1: 统计集合set1中的元素个数, 应用: 微博求粉丝数
sinter set1 set2: 求set1与set2的交集, 应用: 微博共同关注的人
sdiff set1 set2: 求s1与s2的差集, 即s1-s2, 应用: cmdb项目比较新老数据
'''
使用有序集合做排行榜
'''
zadd game_rank 666 nick 888 tank 777 jason # 创建game_rank有序集合并添加数据
zcount game_rank 666 777 # 计算game_rank有序集合中分数在[666-777]之间的元素的个数
zincrby game_rank 333 nick # 将game_rank有序集合中nick成员的分数增加333
zrange game_rank 0 1 # 获取game_rank有序集合中索引为[0-1]的成员
zrevrange game_rank 0 1 # 将game_rank有序集合中的成员按分数降序排列后, 获取索引为[0-1]的成员
应用: 微博热搜, 游戏排行榜
'''
python操作redis数据库
'''
import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=1, password=None, decode_responses=True, max_connections=10) # 创建连接池
r = redis.Redis(connection_pool=pool) # 通过连接池, 使用"r."的方式操作redis数据库, 使用连接池可以免除线程与redis服务建立链接的时间
'''
通过配置将django缓存数据存到redis中
django_redis既能使django缓存做数据持久化, 又能使redis存储自定义对象
'''
# ...luffyapidev_manage.py
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100},
"DECODE_RESPONSES": True,
"PSAAWORD": "",
}
}
}
# ...luffyapiscripts est.py
import os
import django
from django.core.cache import cache
from luffyapi.apps.user import models
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "luffyapi.settings.dev_settings")
django.setup()
user_queryset = models.User.objects.all()
cache.set('user_queryset', user_queryset, 300)
print(cache.get('user_queryset'))
'''
接口缓存
将大量访问但不需要实时更新数据的接口建立缓存
'''
# ...luffyapiluffyapiappshomeviews.py
...
from rest_framework.generics import ListAPIView
from django.core.cache import cache
class BannerListAPIView(ListAPIView):
queryset = models.Banner.objects.filter(id_delete=False, is_show=True).order_by('-orders')[: settings.BANNER_AMOUNT] # 惰性查询
serializer_class = my_serializers.BannerModelSerializer
# 重写list方法建立轮播图接口缓存
def list(self, request, *args, **kwargs):
banner_cache = cache.get('banner_cache')
if not banner_cache:
response = super().list(request, *args, **kwargs)
cache.set('banner_cache', response.data)
return response
return Response(data=banner_cache)
'''