• Redis


    Redis相关

    简介

    首先我们要知道Redis是什么,他是一个数据库,是一个key-value型的数据库,或者说内存型的数据库.

    Redis相对于其他key-value型的数据库有什么优点呢,大致可以分为以下三点:

    1. Redis支持数据的持久化,也就是说并不是简单的只存在于内存中,Redis是会把内存中的数据存储到磁盘中的,这样数据库重启的时候数据也不会丢失,可以再次加载使用.
    2. Redis支持多种类型的数据,除了最基础的key-value之外,还支持list,set,zset,hash等数据结构的存储.
    3. Redis还支持数据的备份,即master-slave模式的数据备份.
    4. Redis的性能极高,大概读的速度是110000次/s左右,写的速度是81000次/s左右.

    所以,这些优点就决定了我们会经常使用redis数据库.

    Redis的安装

    windows下的安装

    下载地址: https://github.com/MSOpenTech/redis/releases

    里面有32位和64位的安装包,根据情况下载即可,文件名为Redis-x64-xxx.zip,解压后将文件重命名为redis即可.

    # 安装完之后,我们通过cmd终端来进入解压好的文件夹,然后执行以下指令
    
    # 启动服务:注意,启动之后cmd终端不能关闭,否则server会断开
    redis-server
    # 连接默认数据库
    redis-cli
    # 连接指定数据库 
    redis-cli -h ip地址 -p 端口号 -n 数据库名
    # eg:
    redis-cli -h 127.0.0.1 -p 6379 -n 1
    # 切换数据库
    select 数据库名
    # eg:
    select 1
    

    为了解决server端的cmd窗口一旦关闭server就会断开的问题,我们可以把redis安装成windows服务,步骤如下:

    # 1. cmd窗口cd进入redis的文件夹,执行下面语句
    redis-server --service-install redis.windows.conf
    # 2. 安装好之后,用下面的语句启动服务
    redis-server --service-start
    # 3. 可以通过下面语句停止服务
    redis-server --service-stop
    # 4. 还可以通过下面语句卸载服务
    redis-server --service-uninstall
    

    linux下的安装

    linux下输入以下指令:

    wget http://download.redis.io/releases/redis-2.8.17.tar.gz
        
    tar xzf redis-2.8.17.tar.gz
    cd redis-2.8.17
    make
    
    # 上面执行完之后,就可以启动redis的server端了,进入安装目录的src目录下
    cd src 
    ./redis-server
    

    redis对五种数据类型的操作

    字符串(String)

    # 1. 设置指定key值 set key value
    set today happy
    
    # 2. 获取指定的key值 get key
    get today
    "happy"
    
    # 3. 获取key中字符串的子字符串 getrange key start end
    getrange today 0 2 
    "hap"
    
    # 4. 当key不存在时设置key的值, setnx key value
    setnx today hap
    (integer) 0	# 因为today存在,所以设置key值不成功,影响行数为0
    setnx tomo 10
    (integer) 1	# 因为tomo不存在,所以设置key-value成功,影响行数为1
    
    # 5. 获取key所存储的字符串的长度 strlen key
    strlen today
    (integer) 5		# happy长度为5
    
    # 6. 将key中储存的数字值减一(如果是数字的话) decr key
    decr tomo 
    (integer) 9
    decr today		# 如果key对应的value值不是数字,会报错
    (error) ERR value is not an integer or out of range
    

    哈希(Hash)

    # 1. 设置指定hash值, hmset hash表名 key1 value1 key2 value2 key3 value3
    hmset redis name "redis" description "redis basic commands for caching" likes 20 visitors 23000
    
    # 2. 获取指定的hash值, hgetall key
    hgetall redis
    1) "name"
    2) "redis"
    3) "description"
    4) "redis basic commands for caching"
    5) "likes"
    6) "20"
    7) "visitors"
    8) "23000"
    
    # 3. 获取hash表中所有key, hgetall 哈希表名
    hgetall redis
    1) "name"
    2) "description"
    3) "likes"
    4) "visitors"
    

    列表(List)

    # 1. lpush 向列表内添加值, lpush key value 
    lpush lis 1
    lpush lis 2
    lpush lis 3
    lpush lis 4
    
    # 2. 查看列表值 : lrange key start end
    lrange lis 0 1000
    1) "4"
    2) "3"
    3) "2"
    4) "1"
    
    # 3. 将一个值插入到已存在的列表头部:lpushx key value
    lpushx lis 5
    
    # 4. 移除列表最后一个元素: rpop key
    rpop lis
    "1"
    

    集合(Set)

    集合的特点在于可以自动去重,添加重复元素的时候会自动去除

    # 1. 添加集合元素: sadd key value
    sadd set1 a
    sadd set1 b
    sadd set1 c
    sadd set1 a
    
    # 2. 查看集合元素,注意,集合是无序的,并不是按我们存进去的顺序查出来的
    smembers set1
    1) "b"
    2) "a"
    3) "c"
    
    # 3. 判断member元素是否是集合key的成员:sismember key member 
    sismember set1 b
    (integer) 1		# 存在b,就会返回1
    

    有序集合(sorted set)

    有序集合和集合相同的一点在于,同样不允许有重复的元素存在.

    不同的是每个元素会关联一个double类型的分数(权重),这个分数就是redis对集合排序的依据.

    # 1. 添加有序集合元素: zadd key score1 member1 [score2 member2] 同时如果member重复会更新其对应score的值
    zadd sset1 1 a
    zadd sset1 2 b
    zadd sset1 3 c
    zadd sset1 4 d
    zadd sset1 5 a
    
    # 2. 查看集合: zrange key 集合元素位置 withscores
    zrange sset1 0 1 withscores
    1) "b"
    2) "2"
    3) "c"
    4) "3"
    
    # 3. 返回有序集合中指定成员的索引: zrank key member
    zrank sset1 a
    (integer) 3
    
    # 4. 移除有序集合里面给定的分数区间的所有成员: zremrangebyscore key min max 
    zremrangebyscore sset1 0 2
    

    redis在Python中的使用

    首先,毫无疑问,我们需要安装redis模块

    pip install redis
    

    然后我们就可以直接使用redis来连接一个redis数据库,而且我们可以选择直接连接一个redis数据库或者建立一个连接池,有更多的用处

    import redis
    
    # 直接连接
    r = redis.Redis(host = '127.0.0.1',port = 6379, db = 1)
    '''
    host是连接的数据库地址
    port是连接的端口号
    db是数据库的名字
    '''
    
    
    # 连接池连接
    pool = redis.ConnectionPool(host = '127.0.0.1',port = 6379, db = 1,max_connections=100)
    # 上面max_connections是连接池的最大连接数
    r = redis.Redis(connection_pool = pool)
    
    
    # 在建立完连接之后,我们就可以直接用r来点出来方法从而完成对redis数据库的操作,大概操作和本身的redis代码几乎完全一样
    
    r.set('name','bob')
    r.setex('name', 3, 'jerry')
    print(r.get('name'))
    
    r.rpush('stus', 's1', 's2', 's3')
    print(r.lrange('stus', 0, 1000))
    
    r.zadd('game', {'a': 10, 'b': 20, 'c': 15})
    print(r.zrevrange('game', 0, 1))
    print(r.zrange('game', 0, 1))
    

    redis在Django中的使用

    django中使用redis大多使用两种方法,即直接使用或者借用缓存cache来使用redis.

    1. 直接使用redis,单例或者连接池
    # 在django的utils文件夹下,建立redis_pool.py,写入
    import redis
    POOL = redis.ConnectionPool('127.0.0.1',6379,max_connection = 100)
    
    # 然后就可以在视图函数里面导入这个文件,使用其连接池的方法
    from django.shortcuts import render, HttpResponse
    import redis
    
    # 写一个模块,写一个pool,导入
    from app01.redis_pool import POOL
    
    
    def setname(request):
        conn = redis.Redis(connection_pool=POOL)
        conn.set('name', 'bob')
        return HttpResponse('设置成功')
    
    
    def getname(request):
        conn = redis.Redis(connection_pool=POOL)
        name = conn.get('name').decode('utf-8')
        return HttpResponse(name)
    
    
    1. 借用缓存的话需要安装django-redis模块
    pip install django-redis
    
    # 1. 在django里的settings.py里面配置缓存存储的位置
    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379/11",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                "CONNECTION_POOL_KWARGS": {"max_connections": 100}
            }
        }
    }
    
    # 2.操作cache模块直接操作缓存:views.py
    from django.core.cache import cache  # 结合配置文件实现插拔式
    # 存放token,可以直接设置过期时间,不加单位默认是秒
    cache.set('token', 'header.payload.signature', 10)
    # 取出token
    token = cache.get('token')
    
  • 相关阅读:
    Codeforces Round #273 (Div. 2) B . Random Teams 贪心
    Codeforces Round #250 (Div. 2)B. The Child and Set 暴力
    Codeforces Round #250 (Div. 1) B. The Child and Zoo 并查集
    微信小程序从零开始开发步骤(二)创建小程序页面
    微信小程序从零开始开发步骤(二)创建小程序页面
    微信小程序从零开始开发步骤(一)搭建开发环境
    微信小程序从零开始开发步骤(一)搭建开发环境
    七个帮助你处理Web页面层布局的jQuery插件
    前端切图:CSS实现隐藏滚动条同时又可以滚动
    前端切图:CSS实现隐藏滚动条同时又可以滚动
  • 原文地址:https://www.cnblogs.com/Xu-PR/p/11979471.html
Copyright © 2020-2023  润新知