zoukankan      html  css  js  c++  java
  • redis基本操作

    redis介绍

    redis安装
    """
    1、官网下载:安装包或是绿色面安装
    2、安装并配置环境变量
    """
    
    redis VS mysql
    """
    redis: 内存数据库(读写快)、非关系型(操作数据方便、数据固定)
    mysql: 硬盘数据库(数据持久化)、关系型(操作数据间关系、可以不同组合)
    
    大量访问的临时数据,才有redis数据库更优
    """
    
    redis VS memcache
    """
    redis: 操作字符串、列表、字典、无序集合、有序集合 | 支持数据持久化(数据丢失可以找回(默认持久化,主动持久化save)、可以将数据同步给mysql) | 高并发支持
    memcache: 操作字符串 | 不支持数据持久化 | 并发量小
    """
    

    Redis操作

    启动服务
    """
    前提:前往一个方便管理redis持久化文件的逻辑再启动服务:dump.rdb(持久化文件就在启动服务的当前路径产生,方便管理该文件,这个配置在redis.windows.conf文件中配置的就是当前路径:dir ./)
    1)前台启动服务
    >: redis-server
    2)后台启动服务
    >: redis-server --service-start
    >:redis-server &   # linux、Mac后台启动
    3)配置文件启动服务
    >: redis-server 配置文件的绝对路径
    eg: redis-server G:Redis
    edis.conf
    >: redis-server --service-start 配置文件的绝对路径
    eg>: redis-server --service-start D:/redis/redis.conf
    """
    
    关闭服务
    redis-cli shutdown # 之后再用redis-cli 就不能连到redis服务端了
    
    密码管理
    """
    1)提倡在配置文件中配置,采用配置文件启动
    requirepass 密码
    
    2)当服务启动后,并且连入数据库,可以改当前服务的密码,但是只是保存在内存中,不会修改配置文件的配置密码,一旦redis服务重启,redis客户端连接密码仍是配置文件设置的密码(服务重启,密码重置)
    config set requirepass 新密码
    
    3)连入数据库,查看当前服务密码密码
    config get requirepass
    """
    
    连接数据库
    """
    1)默认连接:-h默认127.0.0.1,-p默认6379,-n默认0,-a默认无
    >: redis-cli
    
    2)完整连接:  
    >: redis-cli -h ip地址 -p 端口号 -n 数据库编号 -a 密码
    
    3)先连接,后输入密码
    >: redis-cli -h ip地址 -p 端口号 -n 数据库编号
    >: auth 密码
    ====================================================================================
    redis数据库最多可以建立编号0~15,共16个数据库,当连入的数据库编号超过这个范围时,显示的是输入的编号,当取值的时候默认取的是第0个数据库存储的值;
    """
    
    关闭服务
    """
    1)在没有连接进数据库时执行
    >: redis-cli shutdown
    
    2)连接进数据库后执行
    >: shutdown
    """
    
    切换数据库
    """
    1)在连入数据库后执行
    >: select 数据库编号
    """
    
    数据持久化
    """
    1)配置文件默认配置
    save 900 1  # 超过900秒有1个键值对操作,会自动调用save完成数据持久化
    save 300 10  # 超过300秒有10个键值对操作,会自动调用save完成数据持久化
    save 60 10000  # 超过60秒有10000个键值对操作,会自动调用save完成数据持久化
    
    2)安全机制
    # 当redis服务不可控宕机,会默认调用一下save完成数据持久化
    
    3)主动持久化
    >: save  # 连入数据库时,主动调用save完成数据持久化
    
    注:数据持久化默认保存文件 dump.rdb(如果需要,可以在配置文件中修改文件名),保存路径默认为启动redis服务的当前路径
    ""
    

    Redis数据类型

    
    数据操作:字符串、列表、哈希(字典)、无序集合、有序(排序)集合
    	有序集合:游戏排行榜
    	
    字符串:
    	set key value
    	get key
    	mset k1 v1 k2 v2 ... 
    	mget k1 k2 ...
    	setex key exp value  # 将key关联到value并设置过期时间,
    	setnx key value  # 只有key不存在时才可以设置
    	incrby key increment
    	
    列表:
    	rpush key(列表名) value1 value2 ...  # 列表右边添加
    	lpush key value1 value2 ...  # 列表左边添加
    	lpush key value  # 将一个或多个值插入到列表头部
    	rpushx key value...   # 为已存在的列表添加值  
    	lrange key bindex eindex  # 切片,返回切片的值,顾头顾尾,python列表切片,顾头不顾尾
    	ltrim key start stop  # 修剪,返回值是布尔值,此时列表只剩下指定区间的元素,顾头顾尾
    	lindex key index  # 根据索引获取元素
    	lpop key | rpop key  # 删除列表的最后一个元素|第一个元素,返回值为当前删除的元素 
    	llen key # 获取列表长度
    	linsert key before|after old_value new_value
    	
    哈希:
    	hset key field value
    	hget key field
    	hmset key field1 value1 field2 value2 ... # 增加多个k,v
    	hmget key field1 field2
    	hkeys key   # 获取所有keys
    	hvals key  #获取hash表所有的值
    	hdel key field  # 删除一个或多个哈希表字段
    	hincrby key field increment  # 为哈希表key中的指定字段的浮点数值加上增量increment
    	hgetall key  # 获取在哈希表中指定key的所有字段的值
    	hlen key  # 获取hash表的长度
    	
    集合: # 使用集合最主要是使用集合的交集,差集,并集的运算(没有堆成差集),还有去重,不然直接使用列表额可以了
    	sadd key member1 member2 ...
    	sdiff key1 key2 ...  # 求多个哈希表的差集 去除公有的元素,返回自己有别人没有的元素
    	sdiffstore newkey key1 key2 ...   # 返回给定所有集合的差集并存储在newkey中
    	sinter key1 key2 ...  # 返回给定所有集合的交集  共同好友
    	sunion key1 key2 ...  # 返回所有给定集合的并集
    	scard key  # 返回某一个集合的元素的个数
    	smove key1 key2 value  # 将key1中的value移动到key2中,返回bool值
    	sismember key member # 判断member元素是否是集合key的成员,返回布尔值
    	smembers key   # 返回集合中的所有成员
    	spop key  # 移除并返回集合中的一个随机元素 抽奖
    	
    有序集合:# 排行榜
    	zadd key score1 member1 score2 member2 ...  # 向有序集合添加一个或多个成员,或者更新已存在成员的分数
    	zcard  # 获取有序集合的成员数
    	zincrby key score1 member  # 有序集合中对指定成员的分数加上增量  increment  购买装备加经验值
    	zrange key start(索引) end(索引)  # 通过索引返回有序集合指定区间内的成员 默认从小到大排序  名次是倒数的前end名
    	zrevrange key start end  # 返回有序集合中指定区间内的成员,通过索引,分数从高到低 从大到小排序 名次前end名  
    
    

    python使用redis

    依赖
    >: pip3 install redis
    
    直接使用
    # 直接使用
    import redis
    # 默认连接6379,没有密码设置,所以不用填面参数(填了报错),可以自己以配置文件启动(不要配置文件后台启动,启动连得还是6379端口),在配置文件可以修改host,port,password等,
    r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)  # decode_responses将二进制数据解析为字符串
    
    r.set('name','张三')
    r.setnx('hobby','打酱油')
    
    r.setex('age',10,18)  # 给age添加过期时间,参数2才是timeout
    r.mset({'a':1,'b':2, 'c':'good', 'd':'李四'})
    print(r.mget('a', 'b', 'c', 'd','name','bobby'))  # ['1', '2', 'good', '李四', '张三', None]
    
    r.incrby('a',100)
    print(r.mget('a', 'b', 'c', 'd','name','bobby'))  # ['101', '2', 'good', '李四', '张三', None]
    r.rpush('stus','bob', 'ben', 'jerry', 'tom', 'tank')  #
    print(r.lrange('stus',0,1))  # ['bob', 'ben']
    
    r.zadd('games', {'bob':97, 'ben':99, 'jerry':77,'tom':100})
    # 正序去倒数前三名
    print(r.zrange('games',0,2))  #  ['jerry', 'bob', 'ben']
    # 反序取前三名
    print(r.zrevrange('games',0,2))  # ['tom', 'ben', 'bob']
    
    连接池使用
    # reids 连接池版
    import redis
    pool = redis.ConnectionPool(host='localhost', port=6379, db=0, decode_responses=True,max_connections=100)
    redis.Redis(connection_pool=pool)
    
    print(r.zrevrange('games',0,2))  # ['tom', 'ben', 'bob']
    
    缓存使用:要额外安装 django-redis

    pip install django-redis

    # 1.将缓存存储位置配置到redis中:settings.py
    '''
    为什么配置redis缓存,而不使用django的memcache缓存?
    因为memcache是django默认的缓存,该缓存只能在项目存活阶段才有数据,项目重启缓存数据就丢失了,而配置redis缓存,可以将数据缓存到redis,redis 可以持久化,即使django项目重启,缓存的数据也不会丢失。
    '''
    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": "",
            }
        }
    }
    
    # 2.操作cache模块直接操作缓存:views.py
    from django.core.cache import cache  # 结合配置文件实现插拔式
    # 存放token,可以直接设置过期时间
    cache.set('token', 'header.payload.signature', 300)
    # 取出token
    token = cache.get('token')
    

    使用django-redis也可以缓存对象了,并且用了redis做缓存,数据得以持久化:

    # 3.测试文件:t_dg.py  
    import redis
    pool = redis.ConnectionPool(max_connections=100,)
    r = redis.Redis(connection_pool=pool)
    
    # from libs import tx_sms
    #
    # code = tx_sms.get_sms_code()
    # print(code)
    # r.setex('sms', 300, code)
    
    import django
    import os
    os.environ.setdefault('DJANGO_SETTINGS_MODULE','luffyapi.settings.dev')
    django.setup()
    from user import models
    
    user_query = models.User.objects.all()
    # redis不能直接存对象
    # r.setex('user_query', 300, user_query)
    
    from django.core.cache import cache
    # django缓存使用的memcache,可以直接存对象,是因为内部将使用pickle将对象做了序列化,
    # 我们没在全局配置CACHE,就默认使用django全局配置的CACHE(memcache缓存),在global_settings文件查看全局配置
    # from django.conf import global_settings
    '''
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        }
    }
    在LocMemCache类中写了set,get,incr,add,delete,clear等方法
    '''
    cache.set('user_query',user_query,300)
    print(cache.get('user_query'))  # <QuerySet [<User: admin>, <User: 14455667788>, <User: 13344556678>]>
    
  • 相关阅读:
    C#實現列舉DB中所有StoredProcedur
    Configure the browserJMeter
    DB 字段
    SQL Server 角色類型
    將N行數據合併成一行顯示
    性能计数器
    一千萬條以上記錄分頁數據庫優化
    SPFA静态链表优化+队列储存
    多源最短路pku1125
    图的连通性——folyd检验
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/13051003.html
Copyright © 2011-2022 走看看