redis介绍及常见问题总结
1.redis
c语言编写的一个开源软件,使用字典结构存储数据,支持多种类型数据类型
数据类型:字符串,字典,列表,集合,有序集合
2.redis特点
速度快:c语言实现的,所有数据都存储在计算机内存中
持久化:他会将数据定期保存到文件系统中,但redis节点故障时,数据文件可以从redis数据文件恢复
支持多种数据结构:字典,集合,列表,有序集合,字符串
支持多种语言的API:JAVA,C,php,python,Ruby,node.js,C++等
功能齐全:支持事物,发布/订阅,LUA脚本等功能
主从复制:主服务器(master)执行添加、修改、删除,从服务器执行查询
高可用及分布式:2.8版本支持高可用,3.0支持分布式
3.Memcached和Redis对比
1.性能上:Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis。
2.内存空间和数据量大小:Memcached可以修改最大内存,采用LRU算法。Memcached单个key-value大小有限,一个value最大只支持1MB,而Redis最大支持512MB
3.操作便利上:Memcached数据结构单一,而Redis支持更加丰富的数据类型
4.可靠性:MemCached不支持数据持久化,断电或重启后数据消失。Redis支持数据持久化和数据恢复和集群,允许单点故障
5.应用场景:
Memcached:动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等)
Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)
4.redis的持久化策略
RDB:每隔一段时间对redis进行一次持久化。
- 缺点:数据不完整 - 优点:速度快
AOF:把所有命令保存起来,如果想到重新生成到redis,那么就要把命令重新执行一次。
- 缺点:速度慢,文件比较大 - 优点:数据完整
5.其他常见问题
如果redis中的某个列表中的数据量非常大,如果实现循环显示每一个值?
- 如果一个列表在redis中保存了10w个值,我需要将所有值全部循环并显示,请问如何实现?
一个一个取值,列表没有iter方法,但能自定义
def list_scan_iter(name,count=3):
start = 0
while True:
result = conn.lrange(name, start, start+count-1)
start += count
if not result:
break
for item in result:
yield item for val in list_scan_iter('num_list'):
print(val)
场景:投票系统,script-redis
redis如何实现主从复制以及数据同步?
# 实现主从复制
'创建6379和6380配置文件'
redis.conf:6379为默认配置文件,作为Master服务配置;
redis_6380.conf:6380为同步配置,作为Slave服务配置;
'配置slaveof同步指令'
在Slave对应的conf配置文件中,添加以下内容:
slaveof 127.0.0.1 6379
# 数据同步步骤:
(1)Slave服务器连接到Master服务器.
(2)Slave服务器发送同步(SYCN)命令.
(3)Master服务器备份数据库到文件.
(4)Master服务器把备份文件传输给Slave服务器.
(5)Slave服务器把备份文件数据导入到数据库中. 优势:
- 高可用
- 分担主压力
注意:
- slave设置只读
redis中sentinel的作用?
帮助我们自动在主从之间进行切换(哨兵)
检测主从中 主是否挂掉,且超过一半的sentinel检测到挂了之后才进行进行切换。
如果主修复好了,再次启动时候,会变成从。 启动主redis:
redis-server /etc/redis-6379.conf 启动主redis
redis-server /etc/redis-6380.conf 启动从redis 在linux中:
找到 /etc/redis-sentinel-8001.conf 配置文件,在内部:
- 哨兵的端口 port = 8001
- 主redis的IP,哨兵个数的一半/1 找到 /etc/redis-sentinel-8002.conf 配置文件,在内部:
- 哨兵的端口 port = 8002
- 主redis的IP, 1 启动两个哨兵
实现redis集群
#基于【分片】来完成。
- 集群是将你的数据拆分到多个Redis实例的过程
- 可以使用很多电脑的内存总和来支持更大的数据库。
- 没有分片,你就被局限于单机能支持的内存容量。
#redis将所有能放置数据的地方创建了 16384 个哈希槽。
#如果设置集群的话,就可以为每个实例分配哈希槽:
- 192.168.1.20【0-5000】
- 192.168.1.21【5001-10000】
- 192.168.1.22【10001-16384】
#以后想要在redis中写值时:set k1 123
- 将k1通过crc16的算法转换成一个数字,然后再将该数字和16384求余,
- 如果得到的余数 3000,那么就将该值写入到 192.168.1.20 实例中。
#集群方案:
- redis cluster:官方提供的集群方案。
- codis:豌豆荚技术团队。
- tweproxy:Twiter技术团队。
redis中默认的哈希槽
#redis中默认有 16384 个哈希槽。
redis支持的过期策略(6个)
# 数据集(server.db[i].expires)
a、voltile-lru: #从已设置过期时间的数据集中,挑选最近频率最少数据淘汰
b、volatile-ttl: #从已设置过期时间的数据集中,挑选将要过期的数据淘汰
c、volatile-random:#从已设置过期时间的数据集中,任意选择数据淘汰
d、allkeys-lru: #从数据集中,挑选最近最少使用的数据淘汰
e、allkeys-random: #从数据集中,任意选择数据淘汰
f、no-enviction(驱逐):#禁止驱逐数据
MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中都是热点数据?
# 限定Redis占用的内存,根据自身数据淘汰策略,淘汰冷数据,把热数据加载到内存。
# 计算一下 20W 数据大约占用的内存,然后设置一下Redis内存限制即可。
什么是codis及其作用?
Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说,
连接到 Codis-Proxy(redis代理服务)和连接原生的 Redis-Server 没有明显的区别,
上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作,
所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务.
什么是twemproxy机器及其作用?
# 什么是Twemproxy
是Twtter开源的一个 Redis 和 Memcache 代理服务器,
主要用于管理 Redis 和 Memcached 集群,减少与Cache服务器直接连接的数量。
他的后端是多台REDIS或memcached所以也可以被称为分布式中间件。
# 作用
通过代理的方式减少缓存服务器的连接数。
自动在多台缓存服务器间共享数据。
通过配置的方式禁用失败的结点。
运行在多个实例上,客户端可以连接到首个可用的代理服务器。
支持请求的流式与批处理,因而能够降低来回的消耗。
redis中的watch命令的作用?
用于监视一个或多个key, 如果在事务执行之前这个/些key被其他命令改动,那么事务将被打断
基于redis商城商品数量计数器(使用watch命令)
import redis conn = redis.Redis(host='192.168.1.41',port=6379) conn.set('count',1000) with conn.pipeline() as pipe: # 先监视,自己的值没有被修改过
conn.watch('count') # 事务开始
pipe.multi()
old_count = conn.get('count')
count = int(old_count)
if count > 0: # 有库存
pipe.set('count', count - 1) # 执行,把所有命令一次性推送过去
pipe.execute()
redis分布式锁heredlock实现机制
实现
- 写值并设置超时时间
- 超过一半的redis实例设置成功,就表示加锁完成。
- 使用:安装redlock-py
from redlock import Redlock dlm = Redlock(
[
{"host": "localhost", "port": 6379, "db": 0},
{"host": "localhost", "port": 6379, "db": 0},
{"host": "localhost", "port": 6379, "db": 0},
]
) # 加锁,acquire
my_lock = dlm.lock("my_resource_name",10000)
if my_lock:
# 进行操作
# 解锁,release
dlm.unlock(my_lock)
else:
print('获取锁失败')
一致性哈希概念
# 一致性哈希
一致性hash算法(DHT)可以通过减少影响范围的方式,解决增减服务器导致的数据散列问题,从而解决了分布式环境下负载均衡问题;
如果存在热点数据,可以通过增添节点的方式,对热点区间进行划分,将压力分配至其他服务器,重新达到负载均衡的状态。
# 模块:hash_ring
如何高效的找到redis中所有以zhugc开头的key?
可以使用keys命令来加速查找
# 语法:KEYS pattern
# 说明:返回与指定模式相匹配的所用的keys。
该命令所支持的匹配模式如下:
1、?:用于匹配单个字符。例如,h?llo可以匹配hello、hallo和hxllo等;
2、*:用于匹配零个或者多个字符。例如,h*llo可以匹配hllo和heeeello等;
2、[]:可以用来指定模式的选择区间。例如h[ae]llo可以匹配hello和hallo,但是不能匹配hillo。同时,可以使用“/”符号来转义特殊的字符
# 注意
KEYS 的速度非常快,但如果数据太大,内存可能会崩掉,
如果需要从一个数据集中查找特定的key,最好还是用Redis的集合结构(set)来代替。
如何基于redis实现发布和订阅?
# 发布和订阅,只要有任务就所有订阅者每人一份。
发布者: #发布一次
import redis
conn = redis.Redis(host='127.0.0.1',port=6379)
conn.publish('104.9MH', "hahahahahaha")
订阅者: #'while True'一直在接收
import redis
conn = redis.Redis(host='127.0.0.1',port=6379)
pub = conn.pubsub()
pub.subscribe('104.9MH')
while True:
msg= pub.parse_response()
print(msg)
详细介绍链接:redis为什么这么快
redis介绍及常见问题总结的更多相关文章
- Redis介绍及Jedis测试
1.Redis简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes ...
- Redis介绍及Jedis基础操作
1.Redis简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes ...
- Redis介绍以及安装(Linux)
Redis介绍以及安装(Linux) redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcached类似,但很大程度补偿了memcached的不足,它支持存储的 ...
- Redis介绍及常用命令
一 Redis介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发 ...
- redis 介绍和常用命令
redis 介绍和常用命令 redis简介 Redis 是一款开源的,基于 BSD 许可的,高级键值 (key-value) 缓存 (cache) 和存储 (store) 系统.由于 Redis 的键 ...
- redis笔记总结之redis介绍
一.Redis介绍: redis的发展历史简单的理解为因为使用类似MySql这类关系型数据库不方便进而开发的开源的.轻量级的.非关系型的,直到现在一直不断完善的一款NoSql数据库.具体的介绍大家可以 ...
- redis介绍、安装、redis持久化、redis数据类型
1.redis介绍 2.安装管网:https://redis.io/下载:wget -c http://download.redis.io/releases/redis-4.0.11.tar.gz解 ...
- 阿里云(四)Linux 实例常用内核网络参数介绍与常见问题处理
Linux 实例常用内核网络参数介绍与常见问题处理 https://help.aliyun.com/knowledge_detail/41334.html
- redis介绍以及安装
一.redis介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的values类型相对更多,包括字符串.列表.哈希散列表.集合,有序集合. 这些数据类型都支持pus ...
随机推荐
- 【mysql】mysql数据库安装
今天一直在测功能,整理用例,所以没有去调项目,想到之前有小伙伴求助数据库安装,还远程了一番,所以,就整理一下,数据库在测试工作中还是挺重要的,不能本地测试改个数据都去找开发小哥哥吧,是不是不太好呢,妹 ...
- JS预编译详解
我们都知道javascript是解释型语言,执行的特点呢是编译一行,执行一行.按照这个思路有时候我们在运行代码时会有一些令人费解的现象出现.下面我们一起来执行下面三段代码. <script> ...
- 【linux相识相知】独立硬盘冗余阵列-RAID
独立硬盘冗余阵列(RAID,Redundant Array of Independant Disks),旧称为廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks ...
- JS常用的设计模式(2)——简单工厂模式
简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...
- 深入理解JavaScript系列(9):根本没有“JSON对象”这回事!
前言 写这篇文章的目的是经常看到开发人员说:把字符串转化为JSON对象,把JSON对象转化成字符串等类似的话题,所以把之前收藏的一篇老外的文章整理翻译了一下,供大家讨论,如有错误,请大家指出,多谢. ...
- tomcat一个IP绑定多个域名,不同域名访问不同的应用
修改conf文件夹下面的server.xml的Engine里面的内容即可原始内容如下: …… <Engine name="Catalina" defaultHost=&quo ...
- 2017年10月29日 数据库查询总结&45道题
日期函数: 当前时间:GetDate() 两个时间差:DateDiff() 一. 设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Tea ...
- [LeetCode]23. Merge k Sorted Lists合并K个排序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...
- python 对象属性与 getattr & setattr
Python对象的属性可以通过obj.__dict__获得,向其中添加删除元素就可以实现python对象属性的动态添加删除的效果,不过我们应该使用更加正规的getattr和setattr来进行这类操作 ...
- 前端自动分环境打包(vue和ant design)
现实中的问题:有时候版本上线的时候,打包时忘记切换环境,将测试包推上正式服务器,那你就会被批了. 期望:在写打包的命令行的时候就觉得自己在打包正式版本,避免推包时候的,不确信自己的包是否正确. 既然有 ...