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介绍及常见问题总结的更多相关文章

  1. Redis介绍及Jedis测试

    1.Redis简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes ...

  2. Redis介绍及Jedis基础操作

    1.Redis简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes ...

  3. Redis介绍以及安装(Linux)

    Redis介绍以及安装(Linux) redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcached类似,但很大程度补偿了memcached的不足,它支持存储的 ...

  4. Redis介绍及常用命令

    一 Redis介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发 ...

  5. redis 介绍和常用命令

    redis 介绍和常用命令 redis简介 Redis 是一款开源的,基于 BSD 许可的,高级键值 (key-value) 缓存 (cache) 和存储 (store) 系统.由于 Redis 的键 ...

  6. redis笔记总结之redis介绍

    一.Redis介绍: redis的发展历史简单的理解为因为使用类似MySql这类关系型数据库不方便进而开发的开源的.轻量级的.非关系型的,直到现在一直不断完善的一款NoSql数据库.具体的介绍大家可以 ...

  7. redis介绍、安装、redis持久化、redis数据类型

    1.redis介绍  2.安装管网:https://redis.io/下载:wget -c http://download.redis.io/releases/redis-4.0.11.tar.gz解 ...

  8. 阿里云(四)Linux 实例常用内核网络参数介绍与常见问题处理

    Linux 实例常用内核网络参数介绍与常见问题处理 https://help.aliyun.com/knowledge_detail/41334.html

  9. redis介绍以及安装

    一.redis介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的values类型相对更多,包括字符串.列表.哈希散列表.集合,有序集合. 这些数据类型都支持pus ...

随机推荐

  1. Java入门系列-07-从控制台中接收输入

    这篇文章帮你使用Scanner类从控制台接收输入 从控制台接收字符串 敲一敲: import java.util.Scanner; public class DemoScanner { public ...

  2. div内容溢出

    前几天遇到一个问题,代码是这样一个层次: <div class="province"> <ul> <li>1</li> <li ...

  3. info.plist 安全登录

    设置info.plist 安全登录 App Transport Security Settings  dictionary Allow Arbitrary Loads  Boolean  YES

  4. MySQL中在原表中做数据去重(按日期去重,保留id最小的记录)

    表名称 code600300 delete from code600300 where id not in (select minid from (select min(id) as minid fr ...

  5. 【数据库】3.0 MySQL入门学习(三)——Windows系统环境下MySQL安装

    1.0 我的操作系统是window10 专业版 64位.,不过至少windows7以上系统都是一样的. 关于MySQL如何下载,请参考博文: [数据库]2.0 如何获得MySQL以及MySQL安装 h ...

  6. stroke和fill顺序对绘图的影响

    用canvas绘制线条和填充,fill()和stroke()调用顺序直接影响绘制的结构 先调用stroke在调用fill,绘制的效果看上去lineWidth只绘制出来一半,还以为是个大问题. < ...

  7. PowerDesigner 连接数据库(以MySQL)为例

  8. Java—IO流 文件的编码

    文件的编码 package cn.test; import java.io.UnsupportedEncodingException; public class Demo15 { public sta ...

  9. php 四种基本排序算法

    冒泡排序 思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来. 第一轮:从第一个到最后一个冒泡比较,运行结果:最后一个最大 第二轮:从第一个到倒数第二个冒泡比较, 运行结果:最后一 ...

  10. 1.LVS理论基础

    查看我的有道云笔记: http://note.youdao.com/noteshare?id=68e0ca45757943e482ba390d4d49369f&sub=4A2A593CDE2D ...