redis

redis与memcache

前端数据库: cookie, sessionStorage, localStorage

  1. redis支持的数据结构有: 字符串、列表、字典、无序集合、有序集合, 而memcache只支持字符串
  2. 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数据持久化

  1. 数据丢失找回: 服务器关闭时默认会调用save将内存中的数据持久化保存到 dump.rdb 中, dump.rdb的位置可以在 D:Redismy_redis.conf 中进行修改

  2. 满足指定条件时周期性调用save将内存中的数据持久化保存到 dump.rdb 中, 可以在 D:Redismy_redis.conf 中修改条件和周期

  3. 主动调用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)
'''
原文地址:https://www.cnblogs.com/-406454833/p/12709313.html