首页 > 技术文章 > Redis 简介

quqinchao 2018-11-02 20:52 原文

1. 简介

1key-value存储系统,key为字符串类型,只能通过key对value进行操作

2、支持的数据类型
String: 字符串
Hash: 散列
List: 列表
Set: 集合
Sorted Set: 有序集合

3、支持组从同步,数据从主服务器上向任意从服务器上同步

4、事务,允许一组命令在单一步骤下执行

5、原子性,都执行或都不执行

2. redis与mysql关系

  • 存储区域:内存 硬盘
  • redis 适合存放频繁使用的数据,由于在内存读取速度快,如:排行榜,计数; MySQL 存储冷数据
  • mysql(主)+redis(辅),redis当做缓存来处理数据,与用户交互时查数据优先去redis,再去mysql
  • 数据类型少,查询功能弱,开发效率较低,是个高速存储器,适合做缓存使用

3. 基本操作

  • string
1、创建单个值set,多个值mset
import redis
r=redis.Redis (host='127.0.0.1',port=6379)
r.set('foo','Bar')
2、取单个值get,取多个值mget
print(r.mget('k3','k4'))   # 根据key 取多个值
3、strlen.key   #通过key取对应value值的长度
4、getrange(key, start, end) #切片获取指定的值
5、setrange(key,offset, value) # 修改值  指定索引offset修改成value
6、print(r.incr('nam',amount=4)) 
# 自增,key值存在在原有的值上加amount,key 值不存在创建key:amount
7、append(key, value) #追加

 

  • Hash
1、创建hset(name, key, value) 
2、批量创建 hmest(name,{'k1':'v1', 'k2': 'v2'})
3、hget 取单个; hmget 取多个值
4、hgetall('key')  #获取key 对应的所有值
5、hlen('key')  #获取key对应的hash中键值对的个数
6、hkeys(name) # name 对应的所有key的值
7、hvals(name) # 所有value值
8、hdel(name,*keys) 指定hash的中key,删除键值对
8、hincrby(name, key, amount=1)
#key 存在自增,不存在创建key:amount
注:hincrbyfloat 自增浮点数
9、hscan(name, cursor=0, match=None, count=None)
注:用于取大数据,迭代取值
参数:
    # name,redis的name
    # cursor,游标(基于游标分批取获取数据)
    # match,匹配指定key,默认None 表示所有的key
    # count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数
例:
print(conn.hscan('k2',cursor=2,count=3))
print(conn.hscan_iter('k2'))
for item in conn.hscan_iter('k2'):
    print(item)

 

  • List
1、添加 lpush(name,values)
# print(r.lpush('kk','ff',44,99))
2、lpushx(name,value) 
# name 存在 从左边开始添加
3、llen(name) # 对应 list的个数
4、linsert(name, where, refvalue, value)) # 在某一个值的前或者后插入值
参数:
     # name,redis的name
    # where,BEFORE或AFTER(小写也可以)
    # refvalue,标杆值,即:在它前后插入数据(如果存在多个标杆值,以找到的第一个为准)
    # value,要插入的数据
5、lset(name, index, value) # 指定索引修改值
6、lrem(name, value, num) #在name对应的list中删除指定的值
参数:
    # name,redis的name
    # value,要删除的值
    # num,  num=0,删除列表中所有的指定值;
    num=2,从前到后,删除2个;
    num=-2,从后向前,删除2个
7、lpop(name) # #删除name对应的列表中左侧第一个元素
注: rpop  删除右侧第一个
8、lindex(name, index) # 根据索引取值
9、rpoplpush(src, dst) #将数据从一个列表添加到另一个列表
10、lrange(name, start, end) #分片获取数据
11、列表数据较大需要自定义增量迭代
def ll_sacn(name,count=2):
    index=0
    while True:
        data_list=conn.lrange(name,index,index+count-1)
        if not data_list:
            return
        index=index+count
        for item in data_list:
            yield item

for i in ll_sacn('ll'):
    print(i)

 

  • Set 无序集合
  • Sorted Set 有序集合 (排行榜应用)
  • 其他操作
1、delete(*names) #删除任意数据类型
2、exists(name) #判断name是否存在
3、keys(pattern='*') # 根据模型匹配key值
4、expire(name ,time) #设置超时时间
5、rename(src, dst) # 重命名
6、scan(cursor=0, match=None, count=None)
scan_iter(match=None, count=None)
# 增量迭代获取key
7、move(name, db)) # name移动的指定的db下

 

4. 使用redis

4.1 在pychram 中使用

import redis
#添加数据
r=redis.Redis (host='127.0.0.1',port=6379)
r.set('foo','Bar')
print(r.get('foo'))

#连接池
pool =redis .ConnectionPool (host='127.0.0.1',port=6379)
r=redis.Redis (connection_pool= pool)
r.set('name',77)
print(r.get('name'))

 

4.2 在Django中使用

  • 方式一:
1、utils文件夹下,建立redis_pool.py
import redis
POOL = redis.ConnectionPool(host='127.0.0.1', port=6379,password='1234',max_connections=1000)
2、视图函数中
import redis
from django.shortcuts import render,HttpResponse
from utils.redis_pool import POOL

def index(request):
    conn = redis.Redis(connection_pool=POOL)
    conn.hset('kkk','age',18)
    return HttpResponse('设置成功')

 

  • 方式二:
1、安装django-redis模块
2、在setting中配置
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
            # "PASSWORD": "123",
        }
    }
}
3、视图函数中
from django_redis import get_redis_connection
conn = get_redis_connection('default')
print(conn.hgetall('xxx'))

 

推荐阅读