Redis数据库

1.完全基于内存读写的非关系型数据库(支持持久化存储)

【1】key:value键值对方式组织数据,所有的键值对都有设置过期的功能<弱事务型的数据库>;
【2】核心操作都采用单进程单线程的数据库;
【3】应用:1.缓存;2.并发计数;3.排行榜;4.生产者消费者模型 5.增量式爬虫......
【4】主从复制,哨兵模式!<永远记住Redis是单进程单线程的!>
【5】Redis对于过期的key淘汰策略:(1)Redis主动删除:将带过期时间的key存在一个独立的hash中,默认每100毫秒进行过期扫描:1.每次随机选20个key进行判断 2.检查过期的时间,删除已过期的key 3.如果删除的比例超过1/4则重复1-3的操作;<默认每次循环的主动删除用时小于25ms>---------------------------------------------------------------------------------Q:【场景】当大量的key同时过期<过期时间太集中>,Redis会有卡顿问题;A:【方案】set key value ex time + 时间偏移量---------------------------------------------------------------------------------(2)Redis惰性删除:1.当get key时,如果key过期了,则直接删除;# Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据?2.Redis配置maxmemory检查,当Redis的使用内存量大于maxmemory时,再次主动进行对过期key进行淘汰;1)noeviction:  拒绝写服务<默认配置>;2)volatile-lru:淘汰过期及较少使用的key;

1.1Python实现 LRU Cache

【1】LRU: 最近最少使用算法;
【2】算法:
class Lru:def __init__(self, capacity):self.cache = {}self.cache_list = []self.capacity = capacitydef get_cache(self, key):if key in self.cache_list:if key == self.cache_list[-1]:return self.cache[key]else:self.cache_list.remove(key)self.cache_list.append(key)else:return 'this key is no cache'def set_cache(self, key, value, expire=60):if len(self.cache) == self.capacity:for i in range(len(self.capacity // 2)):self.cache.pop(self.cache_list.pop(0))else:self.cache[key] = valueself.cache_list.append(key)return value

2.基础

【1】Redis默认0-15库;非关系型数据库的数据查找一定是根据具体的key值精确查找;
【2】字符串类型:set key value [ex time]     #为一个键值对添加过期时间get key重点:字符串类型数字操作:incrby key number       #加法decrby key number       #减法incr/decr key           #自增/自减1key的一般命名规范如:name:email
【3】列表数据类型:列表中的元素必须是字符串;支持两头操作,尽量避免在列表中间操作数据;lpush/rpush key value1 value2 value3....    #插入数据lrange key start stop                       #查看数据 -------------------------------------------------------------------------------------【应用场景】1.生产者消费者模型<中间层:broker--用Redis的list类型的blpop/brpop模拟中间层的消息队列>:blpop/brpop key timeout 2.利用列表可以遍历数据-------------------------------------------------------------------------------------
【4】hash散列类型<有压缩的特点>key {field1:value1,field2:value2... ...}在特定条件下<字段 个数小于512个,value不能超过64bytes>节约内存空间!hset key field1 value1 field2 value2.....hget key field-------------------------------------------------------------------------------------【应用场景】1.用作缓存;2.字典为什么是无序的,因为要进行rehash;
【6】通过Redis的位图操作,进行数据统计setbit key value
【7】 集合操作:SADD key value1 value2 ... ...-------------------------------------------------------------------------------------【应用场景】1.因为集合有自动去重的功能,可以实现增量式爬虫;

3.Python交互Redis

import redis    #导入redis模块
r = redis.Redis(host='127.0.0.1',port=6379,db=0,[password='xxx'])   #创建连接对象
r.方法名()       #调用方法进行操作
r.close()       #关闭Redis的连接对象

3.1Python交互Redis

import pymsql   #导入pymysql模块
db = pymsql.connect(host='',post='',user='',password='',database='',charset='') #创建连接
cur = db.curcors()  #创建游标
cur.execute('sql')  #使用游标操作sql语句
db.commit()         #如果是写操作需要commit
cur.close()         #关闭游标对象
db.close()          #关闭连接对象

4.Redis事务

【1】Redis的事务单独隔离操作,事务中的所有命令会被序列化、按顺序执行<按照客户端隔离> ;MULTI   #开启事务命令1......EXEC    #提交到数据库执行DISCARD #取消事务
【2】事务的重点:事务的开启后,Redis-server会开启对应的命令队列<按照客户端去隔离命令队列>,EXEC后Redis-server开始执行队列中的命令;(1)流水线<编程语言客户端中才支持pipeline功能>:客户端技术,将事务的命令存储在客户端,当EXEC时再将客户端的事务序列发送至Redis-server执行,从而减少通信,提升效率;python操作Redis事务<流水线操作事务>:with r.pipeline(transaction=True) as pipe:pipe.multi()pipe.incr('key')pipe.incr('key')values=pipe.execute()(2)【重点】Redis的乐观锁<WATCH>: 在创建redis事务时,可对指定的key进行监听,命令提交时,如果被监听的key没有被修改时,才能提交成功;如果在本次事务在未EXEC之前,被监听的KEY已经被修改,则本次事务的所有Redis操作全部失败;-------------------------------------------------------------------------------------<防止资源争夺问题>WATCH keymultiincr keyEXEC【悲观锁】:比如MySQL的行级锁或者表级锁;

5.Redis的数据持久化

【1】内存的数据备份到磁盘;
【2】方法一:RDB模式(默认开启)创建RDB文件方式:(1)Redis用户主动备份:SAVE 或者 BGSAVE;(2)设置配置文件条件满足时自动保存(使用最多);RDB的缺点:自动创建RDB文件比较频繁,否则会严重影响服务器的性能,可能会丢失数据;
【3】方法二:AOFAOF存储的是Redis命令,不是真实的数据<需要手动开启配置进行存储>;AOF持久化的原理:每次修改数据库的命令被执行时,将命令写到默认配置的AOF文件;

6.Redis的主从复制

【1】'从'只能接受'读'请求;'主'可以进行'读写'请求;
【2】作用:分担了读的压力(高并发);避免单点问题【如果系统中'主Redis'挂了,'从Redis'能够接替成为'主Redis'】
【3】如果master挂了怎么办?sentinel哨兵:自动化的维护当master挂了之后,维护slave作为'主Redis';

redis怎么开启_关于Redis数据库入门必备的学习点相关推荐

  1. 安装redis并开启_如何安装Redis,以及对Redis配置文件的更改和测试

    Redis的安装 1.下载redis包文件https://redis.io/ 2. 上传安装包(将其压缩包拖入Linux中所需上传的目录下) 3.解压安装包 tar -zxvf redis-5.0.5 ...

  2. redis 主从配置_应用 | Redis实现 主从,单例,集群,哨兵,配置应用

    小小经过一天的休整 公众号更新规则:每周六将会停更一次,进行短期的休整,其余时间继续每天一更. 思维导图如下 Redis 主从配置 这里配置Redis主从 什么是主从 主从复制,是指把一台Redis服 ...

  3. redis 统计数量_使用redis实现在线人数统计

    实现方案 用户登录的时候往redis里面存储一个值(对应的在线人数增1),这个值的key值是和这个用户的唯一识别码(例如userId或者username)有联系,在存储的同时,设置其对应的生命周期,比 ...

  4. redis清理缓存_大话Redis问题

    使用Redis过程中,总是会遇到各种各样问题,这里进行问题的总结,作为Redis 进阶的经验分享. 更新缓存的问题 [主动]需要操作人员去操作,或者定时调度 [被动]由用户触发更新 [预加载]提前加载 ...

  5. aliyun redis 链接超时_用redis做异步队列,原来还可以这样

    Redis设计主要是用来做缓存的,但是由于它自身的某种特性使得它可以用来做消息队列. 它有几个阻塞式的API可以使用,正是这些阻塞式的API让其有能力做消息队列: 另外,做消息队列的其他特性例如FIF ...

  6. java redis id生成器_基于redis的分布式ID生成器

    项目地址 基于redis的分布式ID生成器. 准备 首先,要知道redis的EVAL,EVALSHA命令: 原理 利用redis的lua脚本执行功能,在每个节点上通过lua脚本生成唯一ID. 生成的I ...

  7. java redis 商品秒杀_使用redis秒杀出现产品超发现象求解?

    亲测,用ab 压测并发500 请求4000 无超卖! header("content-type:text/html;charset=utf-8"); $redis = new re ...

  8. java redis延迟队列_基于redis实现的延迟消息队列

    delay-queue redis实现延迟消息队列 需求背景 最近在做一个排队取号的系统 在用户预约时间到达前XX分钟发短信通知 在用户预约时间结束时要判断用户是否去取号了,不然就记录为爽约 在用户取 ...

  9. python机器人编程教程入门_机器人操作系统(ROS)入门必备:机器人编程一学就会

    本书是针对机器人操作系统(ROS)初学者的入门教程,从基础的如何安装ROS,到ROS的框架介绍和C/C++.Python编程基础概念介绍,直至完整搭建一个机器人项目,每一个部分都有详细的操作过程和相应 ...

最新文章

  1. 新增方法java_Java8_map新增方法
  2. Java黑皮书课后题第7章:*7.1(指定等级)编写一个程序读入学生成绩,得到最高分best,然后根据下面的规则给出等级值。程序提示用户输入学生总数,然后提示用户输入所有的分数,最后显示等级给出结论
  3. poj3069 Saruman's Army(贪心)
  4. 初创企通过哪里报名可参与赛事活动
  5. MySQL最基础的操作
  6. 浅析python中的main函数_浅的意思
  7. altium 网口差分走线长度_差分信号的优缺点及布线要求
  8. 数据结构与算法顺序表数组版
  9. 关于最近Vue3+ Vue-CLI3+比较热门的十几篇文章
  10. 几款硬盘接口的速度测试
  11. 机器学习--线性回归1_线性回归-进入迷人世界的第一步
  12. 小甲鱼python【easyGUI】学习笔记
  13. eclipse汉化版的问题
  14. 餐厅点餐系统源码(带电脑端和手机端)
  15. 用python统计字母个数_如何用python统计字符串中字母个数?
  16. SUBMAIL是如何解决短信安全的
  17. 信息学奥赛一本通 1183:病人排队 | OpenJudge NOI 1.10 08:病人排队
  18. 计算机怎么硬盘重做系统,如何对新的硬盘安装系统进行分区并重新安装系统计算机分区教程...
  19. 小说作者推荐:春如棠合集
  20. python的try语句

热门文章

  1. Spring实战——无需一行xml配置实现自动化注入
  2. eventlog analyzer 8.0
  3. 「一本通 4.1 例 3」校门外的树 (loj10115)
  4. C++ 中的指针、引用以及函数调用中的问题
  5. 基于visual Studio2013解决C语言竞赛题之1077大数相加
  6. linux之mktemp命令
  7. sv队列和动态数组的区别_systemverilog中几种数组类型的基础知识
  8. 雷林鹏分享:PHP 变量
  9. 64. 合并排序数组 II
  10. maven项目引入sqljdbc4 找不到包的完美 解决方案。