redis是什么?

mysql是一个软件,帮助开发者对一台机器的硬盘进行操作。
redis是一个软件,帮助开发者对一台机器的内存进行操作。

redis缓存 可达到瞬间并发量10W+

高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解

http://m.sohu.com/a/282430394_99994950?qq-pf-to=pcqq.group

https://www.cnblogs.com/liuqingzheng/p/9833534.html

特点
- 可以做持久化:
- AOF
- RDB
- 单进程单线程
- 相当于是大字典,5大数据类型

redis={
k1:'123', 字符串
k2:[1,2,3,4,4,2,1], 列表
k3:{1,2,3,4}, 集合
k4:{name:123,age:666}, 字典
k5:{('alex',60),('eva-j',80),('rt',70),},有序集合
}
使用字典:
- 基本操作
- 慎重使用hgetall, 优先使用 hscan_iter
- 计数器

注意事项:redis操作时,只有第一层value支持:list,dict ....

关键字:缓存

缓存,优先去redis中获取,如果没有就是数据库。

redis的应用场景

1. top 列表
产品运营总会让你展示最近、最热、点击率最高、活跃度最高等等条件的top list。很多更新较频繁的列表如果使用MC+MySQL维护的话缓存失效的可能性会比较大,鉴于占用内存较小的情况,使用Redis做存储也是相当不错的。

2.最后的访问

用户最近访问记录也是redis list的很好应用场景,lpush lpop自动过期老的登陆记录,对于开发来说还是非常友好的

3.手机验证码的,有效时间

4.限制用户登录的次数,比如一天错误登录次数10次。

5.投票系统 ,投票结果排序。 排行榜等等

6.存储社交信息,set的并集和交集。比较两个用户的共同粉丝

7.各种计数:商品维度计数(点赞数,评论数,浏览数)

8.发布订阅,聊天室等

安装

- redis软件
- yum install redis
redis-server /etc/redis.conf
-
wget http://download.redis.io/releases/redis-3.0.6.tar.gz
tar xzf redis-3.0.6.tar.gz
cd redis-3.0.6
make

/src/redis-server redis.conf

默认端口:6379

配置文件:
bind 0.0.0.0
port 6379
requirepass dskjfsdf

- python连接redis的模块

pip3 install redis

Redis Pttl 命令 - 以毫秒为单位返回 key 的剩余的过期时间

基本使用

a.
import redis
# 创建连接
# conn = redis.Redis(host='47.94.172.250',port=6379,password='luffy1234')
# conn.set('x1','wanghuaqiang',ex=5)
# val = conn.get('x1')
# print(val)
b.
# 连接池
# import redis
#
# pool = redis.ConnectionPool(host='10.211.55.4', port=6379,password='luffy1234',max_connections=1000)
# conn = redis.Redis(connection_pool=pool)
#
# conn.set('foo', 'Bar')

连接池注意:连接池只创建一次
wupeiqi/articles/5132791.html

使用字典
基本操作
慎用hgetall,优先使用hscan_iter
计数器

注意事项:redis操作时,只有第一次value支持:list,dict...
session就是通过数据库,序列化到缓存里的和反序列化拿来用

redis字符串操作总结:

set(name, value, ex=None, px=None, nx=False, xx=False)
在Redis中设置值,默认,不存在则创建,存在则修改
参数:
ex,过期时间(秒)
px,过期时间(毫秒)
nx,如果设置为True,则只有name不存在时,当前set操作才执行,值存在,就修改不了,执行没效果
xx,如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会 
设置新值

get(name)
获取值

mget(keys, *args)
批量获取
如:
mget('k1', 'k2')

r.mget(['k3', 'k4'])

getset(name, value)
设置新值并获取原来的值

getrange(key, start, end)
# 获取子序列(根据字节获取,非字符)
# 参数:
# name,Redis 的 name
# start,起始位置(字节)
# end,结束位置(字节)
# 如: "刘清政" ,0-3表示 "刘"

setrange(name, offset, value)
# 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
# 参数:
# offset,字符串的索引,字节(一个汉字三个字节)
# value,要设置的值

strlen(name)
# 返回name对应值的字节长度(一个汉字3个字节)

incr(self, name, amount=1) #如点赞,提高性能
# 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
# 参数:
# name,Redis的name
# amount,自增数(必须是整数)
# 注:同incrby

append(key, value)
# 在redis name对应的值后面追加内容
# 参数:
key, redis的name
value, 要追加的字符串

# 字符串操作
# conn.set('yyy', 'egon', nx=True)
# conn.set('ttt', 'egon', xx=True)
# import datetime
# v=datetime.timedelta(weeks=2)
# ctime=datetime.datetime.now()
# ctime+v
# conn.setex('ttt', 5,'xxx')

# conn.mset({"k1": 'v1', "k2": 'v12', "k3": 'v3'})
# value=conn.mget('name','k1','k2')
# value=conn.mget(['name','k1','k2'])
# print(value)
# print(conn.getset('name','xxxxxx'))
# conn.setrange('name', 1, 'eerrrrrrrrrrrrrrrr')

# print(conn.strlen('name'))
# conn.set('age',"19")
# 文章阅读数
# conn.incr('age',-4)
# conn.append('name','0000000')

redis字典操作总结:

hscan_iter(name, match=None, count=None)
# 利用yield封装hscan创建生成器,实现分批去redis中获取数据

# 参数:
# match,匹配指定key,默认None 表示所有的key
# count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数

# 如:
# for item in r.hscan_iter('xx'):
# print item

# 字典操作

# conn.hset('person','age','18')
# conn.hset('person','name','lqz')
# conn.hset('person','height','180')
# conn.hmset('person2',{'age':'19','name':'egon','xx':'xx'})
# print(conn.hget('person','name'))
# print(conn.hmget('person','age','name','height'))
# print(conn.hmget('person',['age','name','height']))
# 以后用这个要慎用
# print(conn.hgetall('person'))
# print(conn.hlen('person'))
# print(conn.hkeys('person'))

# print(conn.hexists('person','nameee'))
# conn.hdel('person2','name','age')

# conn.hincrby('person','age')
# for i in range(1000000):
# conn.hmset('person2',{'eeeeee%s'%i:i})
# 如果数据量不大,自动全取出来
# cour, data = conn.hscan('person2', cursor=0, match=None, count=3000)
# cour2, data2 = conn.hscan('person2', cursor=cour, match=None, count=3000)
#
# print(cour)
# print(len(data))
#
# print('-------')
# print(cour2)
# print(len(data2))

# cour2 = 0
# count = 1
# while True:
# cour2, data2 = conn.hscan('person2', cursor=cour2, match=None, count=3000)
# count += len(data2)
# if cour2 == 0:
# break
#
# print(count)
# 不用getall的方式取,用这种方式取,也能把所有数据取出来,但是不会吧内存撑爆
# data=conn.hscan_iter('person2', match=None, count=100)
# # 内部有915371条数据
# # 先去取100条
# # 做成了生成器
# # 取值的时候,100以内,没有再去查,用的是生成器
# # 当超过一百,再去取100条.做成了生成器
# for i in data:
# print(i)

redis列表操作总结:

# 列表操作

# conn.lpush('list','2')
# conn.rpush('list','3')
# conn.lpushx('list2','3')
# print(conn.llen('list'))

# conn.linsert('list', 'after', "3", '444444')
# conn.linsert('list', 'before', "3", '5555555')
# 从0开始
# conn.lset('list',4,'66666666')
# conn.lrem('list',0,"3")
# print(conn.lpop('list'))
# print(conn.rpop('list'))
# 按索引取值,支持负索引
# print(conn.lindex('list',-2))

# 简单的分布式爬虫
# print(conn.blpop('list'))
# 取出列表的所有值

# conn.lpush('list',*[1,2,3,4,45,5,6,7,7,8,43,5,6,768,89,9,65,4,23,54,6757,8,68])
# print(conn.lrange('list',0,-1))
# 自定义列表的增量迭代
# def scan_list(name,count=2):
# index=0
# while True:
# data_list=conn.lrange(name,index,count+index-1)
# if not data_list:
# return
# index+=count
# for item in data_list:
# yield item
# # print(conn.lrange('test',0,100))
# for item in scan_list('list',5):
# print('---')
# print(item)

# 其它操作

# 事务(不支持事务,但是通过管道模拟)
# conn=redis.Redis(host='127.0.0.1', port=6379)
# # 拿到一个管道,transaction=True表示管道内部都是原子性
# pi=conn.pipeline(transaction=True)
# # 说明是批量命令
# pi.multi()
#
#
# pi.set('xx','xxx')
# pi.set('yy','yyy')
#
# pi.execute()

# 其它操作
# conn.delete('name1')
# 用的比较多
# print(conn.keys('k*'))

# print(conn.type('person'))
# django中使用redis

redis 管道(模拟事务)

import redis

pool = redis.ConnectionPool(host='10.211.55.4', port=6379)

r = redis.Redis(connection_pool=pool)

# pipe = r.pipeline(transaction=False)
pipe = r.pipeline(transaction=True)
pipe.multi()
pipe.set('name', 'alex')
pipe.set('role', 'sb') pipe.execute()

  

应用(django):

方式一:

utils文件夹下,建立redis_pool.py

import redis
POOL = redis.ConnectionPool(host='127.0.0.1', port=6379,password='1234',max_connections=1000)

视图函数中使用:

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('设置成功')
def order(request):
conn = redis.Redis(connection_pool=POOL)
conn.hget('kkk','age') return HttpResponse('获取成功')

方式二:

安装django-redis模块

pip3 install django-redis

setting里配置:

# redis配置
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",
}
}
}

视图函数:

from django_redis import get_redis_connection
conn = get_redis_connection('default')
print(conn.hgetall('xxx'))

高级使用: (memachach 不能做持久化)
1. 全站缓存(通过中间件)
wupeiqi/articles/5246483.html

2. 单视图

3. 局部页面

Python- redis缓存 可达到瞬间并发量10W+的更多相关文章

  1. Redis缓存实战教程

    目录 Redis缓存 使用缓存Redis解决首页并发问题 1.缓存使用的简单设计 2.Redis的整合步骤 A 将Redis整合到项目中(Redis+Spring) B 设计一个数据存储策越 3.Re ...

  2. Redis缓存穿透、缓存雪崩、redis并发问题 并发竞争key的解决方案 (阿里)

    阿里的人问我 缓存雪崩(大量数据在同一时间过期了)了如何处理,缓存击穿了如何处理,回答的很烂,做了总结: 把redis作为缓存使用已经是司空见惯,但是使用redis后也可能会碰到一系列的问题,尤其是数 ...

  3. Redis: 缓存过期、缓存雪崩、缓存穿透、缓存击穿(热点)、缓存并发(热点)、多级缓存、布隆过滤器

    Redis: 缓存过期.缓存雪崩.缓存穿透.缓存击穿(热点).缓存并发(热点).多级缓存.布隆过滤器 2019年08月18日 16:34:24 hanchao5272 阅读数 1026更多 分类专栏: ...

  4. 第三节:Redis缓存雪崩、击穿、穿透、双写一致性、并发竞争、热点key重建优化、BigKey的优化 等解决方案

    一. 缓存雪崩 1. 含义 同一时刻,大量的缓存同时过期失效. 2. 产生原因和后果 (1). 原因:由于开发人员经验不足或失误,大量热点缓存设置了统一的过期时间. (2). 产生后果:恰逢秒杀高峰, ...

  5. 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法

    "为什么这个功能用不了?" 程序员:"清一下缓存" 上篇洞悉系列文章给大家详细介绍了MySQL的存储内幕:洞悉MySQL底层架构:游走在缓冲与磁盘之间.既然聊过 ...

  6. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

  7. 基于Python项目的Redis缓存消耗内存数据简单分析(附详细操作步骤)

    目录 1 准备工作 2 具体实施   1 准备工作 什么是Redis? Redis:一个高性能的key-value数据库.支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使 ...

  8. 【高并发简单解决方案】redis缓存队列+mysql 批量入库+php离线整合

    原文出处: 崔小拽 需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化 ...

  9. 高并发架构系列:Redis缓存和MySQL数据一致性方案详解

    一.需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景, ...

随机推荐

  1. ORA-01578 data block corrupted 数据文件损坏 与 修复 (多为借鉴 linux)

    好吧,先说说造成崩溃的原因: 使用redhat 5.9 Linux 作为数据库服务器, 周五数据库正在使用中,硬关机造成数据库文件部分损坏(周一上班时,应用程序启动不起来,查看日志文件时,发现一个数据 ...

  2. OpenCV__cv::Mat::step

    step[0]是矩阵中一行元素的字节数 step[1]是矩阵中一个元素的字节数(elemSize) step1 = step / elemSize1,elemSize1是元素的每个通道所占的字节数 s ...

  3. windows环境下memcache相关配置及PHP加载相应模块(php7版本)

    原文:https://blog.csdn.net/zhangatle/article/details/77504094 亲测安装成功 php 7.0 nts 86 第一步,首先下载windows版本的 ...

  4. 为什么开源外围包安装指导都是按照到/usr/local/目录下,/usr/local与/usr的区别

    很多应用都安装在/usr/local下面,那么,这些应用为什么选择这个目录呢?Automake工具定义了下面的一组变量: Directory variable Default value prefix ...

  5. [SimplePlayer] 8. 音视频同步

    音频与视频在播放当中可能会由于种种原因(如:音视频并非在同一时间开始播放,或视频由于解码任务繁重导致输出图像延迟等)导致音频与视频的播放时间出现偏差,这种就是音视频的同步问题,本文会对音视频同步进行讨 ...

  6. docker_监控

    目录 Docker 自带的监控子命令 sysdig Weave Scope cAdvisor Prometheus Prometheus 的架构 多维数据模型 Docker 自带的监控子命令 ps d ...

  7. [HackerRank]New Year Chaos[UNDONE]

    Input (stdin)Download 2 8 5 1 2 3 7 8 6 4 8 1 2 5 3 7 8 6 4 Your Output (stdout) Too chaotic Too cha ...

  8. LOJ#2723 多边形

    解:首先,n<=20的直接暴力建图然后状压哈密顿回路,相信大家都会.固定1为起点,fi,s表示结尾为i点,状态为s.每次遍历i的出边转移,最后遍历1的出边统计答案.n22n. 然后就是正经题解了 ...

  9. usb输入子系统写程序(三)

    目录 usb输入子系统写程序 小结 内核修改 怎么写代码 类型匹配 probe disconnect 程序设计 1th匹配probe 2th 获取usb数据 3th 输入子系统上报按键 title: ...

  10. LFYZ-OJ ID: 1009 阶乘和

    思路 循环n次,每次计算i的阶乘i!,并加入sum中. n的范围从1~100,这里一定要使用高精度运算,涉及到"高精度乘低精度","高精度加高精度". 避免每次 ...