Redis 可用于内存存储,也可以基于持久化存储 Key-Value的形式存储。
Redis的数据结构
1.字符串(string)
2.字符串列表(lists)
3.字符串集合(sets)
4.有序字符串集合(sorted sets)
5.哈希(hashes)
String
使用INCR、DECR、DECRBY原子操作子操作试用场景:
在某种场景下有3个客户端同时读取了mynum的值(值为2),然后对其同时进行了加1的操作,那么,最后mynum的值一定是5。不少网站都利用redis的这个特性来实现业务上的统计计数需求。
Lists
lists中列表可以当做redis的数据结构,底层实现为链表,插入元素的效率高。lists的常用操作包括LPUSH、RPUSH、LRANGE等。我们可以用LPUSH在lists的左侧插入一个新元素,用RPUSH在lists的右侧插入一个新元素,用LRANGE命令从lists中指定一个范围来提取元素。
PHPresque的队列执行正是基于此实现消息队列
Sets
sets是一直无序的集合
常用操作smembers 集合名称 :列出集合中所有的元素
sismember 集合名称 元素:判断元素是否存在 1表示存在
sadd集合名称 元素:添加元素到集合中
Sorted sets也叫zets
sorted sets是一直有序的集合,集合中的每一个元素都与score(序号)相关联。
常用操作:zadd 集合名称 序号 元素 .添加
zrange集合名称 0 -1 with scores .列出所有元素
Hashes
存储为字符串与字符串值之间的映射
常用操作:创建hash  HMSET hash名称  filed1 值  filed2 值
获取hash值 HGET hashset名称 field
Redis两种持久化存储方式AOF与RDB
RDB这种方式只需在redis.conf配置 save time key  在多长时间内改变多少建值就去在默认的dump.rdb存储一次,存储的路径名称、文件名称的详细配置都可在redis.conf进行配置。
RDB快照执行过程如下
1.Redis使用fork函数复制一份当前的进程(父进程)的副本(子进程)
2.父进程继续处理来自客户端的请求,子进程开始将内存中的数据写入硬盘中的临时文件。
3.当子进程写完所有的数据后,用该临时文件替换旧的RDB文件,一次快照完成。
通过SAVE或者BGSAVE进行快照,手动创建快照存储到rdb文件中。
AOF
AOF可以将Redis执行的每一条写命令追加到硬盘文件中,性能虽受到影响但是可以确保数据安全。
AOF默认是不开启的可以通过redis.conf文件 设置appendonly yes 开启AOF存储。
设置auto-aof-rewrite-percentage 100 目前文件超过上次重写的文件的百分之多少进行重写,如果没有重写则以文件大小为依据。
设置auto-aof-rewrite-min-size 64mb 当AOF文件的大小大于64MB进行重写
也可以手动执行命令BGREWRITEAOF进行重写
配置同步数据硬盘时:
# appendfsync always
appendfsync everysec
# appendfsync no
第一行表示每次AOF写入一个命令都会执行同步操作,这是最安全也是最慢的方式;

第二行表示每秒钟进行一次同步操作,一般来说使用这种方式已经足够;
第三行表示不主动进行同步操作,这是最不安全的方式。
复制
通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据。但是由于数据是存储在一台服务器上的,如果这台服务器的硬盘出现故障,也会导致数据丢失。为了避免单点故障,我们希望将数据库复制多个副本以部署在不同的服务器上,即使有一台服务器出现故障其他服务器依然可以继续提供服务。这就要求当一台服务器上的数据库更新后,可以自动将更新的数据同步到其他服务器上,Redis提供了复制(replication)功能可以自动实现同步的过程。在此之前需要配置一下redis.conf中
bind 为当前的服务器的 IP
配置方法
  • 通过配置文件 从数据库的配置文件中加入slaveof master-ip master-port,主数据库无需配置

  • 通过命令行参数 启动redis-server的时候,使用命令行参数--slaveof master-ip master port

    SLAVEOF master-ip master-port
    redis>SLAVEOF 127.0.0.1 6379
    
  • SLAVEOF NO ONE可以是当前数据库停止接收其他数据库的同步,转成主数据库
  • 配置只读模式
  • slave-read-only yes  设置salve为只读模式
优点及应用场景
  1. 读写分离 通过复制可以实现读写分离以提高服务器的负载能力。在常见的场景中,读的频率大于写,当单机的Redis无法应付大量的读请求时(尤其是较耗资源的请求,比如SORT命令等)可以通过复制功能建立多个从数据库,主数据库只进行写操作,而从数据库负责读操作。
  2. 从数据库持久化
    持久化通常相对比较耗时,为了提高性能,可以通过复制功能建立一个(或若干个)从数据库,并在从数据库中启用持久化,同时在主数据库禁用持久化。当从数据库崩溃时重启后主数据库会自动将数据同步过来,所以无需担心数据丢失。而当主数据库崩溃时,需要在从数据库中使用SLAVEOF
    NO
    ONE命令将从数据库提升成主数据库继续服务,并在原来的主数据库启动后使用SLAVEOF命令将其设置成新的主数据库的从数据库,即可将数据同步回来。
主从复制原理
当一个从数据库启动时,会向主数据库发送SYNC命令,主数据库收到命令后会开始在后台保存快照(即RDB持久化过程),并将保存快照期间接收到的命令缓存起来。当快照完成后,Redis会将快照文件和缓存的命令发给从数据库,从数据库收到数据后,会载入快照文件并执行缓存的命令。以上过程称为复制初始化。复制初始化之结束后,主数据库每收到写命令时就会将命令同步给从数据库,从而保证主从数据库数据一致,这一过程称为复制同步阶段
注意:
  1. 当主从数据库之间的连接断开后,Redis2.8之前的版本会重新进行复制初始化过程,这样就使得主从数据库断开连接后数据恢复的过程的效率很低下。Redis2.8版本的一个重要改进就是断线支持有条件的增量数据传输,当从数据库再次连接到主数据库时,主数据库只需要将断线期间执行的命令发给从数据库即可,大大提高了Redis主从复制的实用性。
  2. 复制同步阶段贯穿整个主从同步过程的始终,直到主从关系终止为止。在复制过程中,即使关闭了RDB方式的持久化(删除所有save参数),依旧会执行快照操作。
PHP Yii2框架中resque的使用

众所周知,PHPResque是基于redis实现的,之前也讲到过队列的问题是基于Redis中列表的数据结构中实现的。首先不禁要问我们为什么要用resuqe,它能干什么?准确的说它也是为了提升服务器的性能,执行一些操作复杂、耗时、量大等工作。
流程:工作内容相同的我们要创建一个类,将不同的要操作的对象或者是参数传递到这个工作类当中去,一次执行这个队列中所有的任务,直到这个队列再也没有工作要去做。
应用的一些场景:
比如说在某一时间段内有大量下单为了更好的用户体验我要首先将下单结果反馈,然后我们要将其放置到队列当中去,当服务器真正空闲的时候(当然距离下单也不能太久),我们可以手动开启队列让其执行。这样就避免了某一时间段请求量过大导致服务器响应慢的问题。还有一些是比较耗时的操作,例如从服务器导出数据并且转换成运营需要的excel格式,如果说http直接请求这个操作的话,没等这些工作做完就直接返回超时。我们就可以考虑将其放入到队列当中去,这样这些工作可以在后台中运行很长时间。
在Yii2中需要安装yii2-resque组件 还需要yiisoft-redis组件
然后按照其描述配置文件
创建工作(注意一定要创建这个ClassWorker这个类,创建这个类中的三个方法,performance方法会被执行):
Yii::$app->resque->createJob('queue_name', 'ClassWorker', $args = []);
创建延时工作:
$time = 1332067214;
Yii::$app->resque->enqueueJobAt($time, 'queue_name', 'ClassWorker', $args = []);
获取当前队列
Yii::$app->resque->getQueues();
开启/关闭 队列(这个命令是在终端执行的)
QUEUE=* php yii resque start/stop

redis滴的更多相关文章

  1. asp.netcore 自动挡Docker Nginx Redis(滴滴滴,自动挡)

    前言 上一章介绍了Docker通过多条命令创建启动运行Docker容器,由此可见这样一个个去创建单独的容器也是相当麻烦的,比如要在某个复杂项目中用DB.缓存.消息等等,这样我们还要去一个个再创建,为此 ...

  2. 三、Redis基本操作——List

    小喵的唠叨话:前面我们介绍了Redis的string的数据结构的原理和操作.当时我们提到Redis的键值对不仅仅是字符串.而这次我们就要介绍Redis的第二个数据结构了,List(链表).由于List ...

  3. ASP.NET Core 使用 Redis 和 Protobuf 进行 Session 缓存

    前言 上篇博文介绍了怎么样在 asp.net core 中使用中间件,以及如何自定义中间件.项目中刚好也用到了Redis,所以本篇就介绍下怎么样在 asp.net core 中使用 Redis 进行资 ...

  4. Redis设计与实现(一~五整合版)【搬运】

    Redis设计与实现(一~五整合版) by @飘过的小牛 一 前言 项目中用到了redis,但用到的都是最最基本的功能,比如简单的slave机制,数据结构只使用了字符串.但是一直听说redis是一个很 ...

  5. 执行大量的Redis命令,担心效率问题?用Pipelining试试吧~

    参考的优秀文章 Request/Response protocols and RTT 来源 原来,系统中一个树结构的数据来源是Redis,由于数据增多.业务复杂,查询速度并不快.究其原因,是单次查询的 ...

  6. logstash 1.5.3 配置使用redis做续传

    logstash是ELK中的一员大将, redis插件也是<The Logstash Book>中介绍的一个很好用的玩意儿. 之前,用比较小的集群部署的时候,没有介入redis中间件,所以 ...

  7. windows redis:Uncaught exception 'RedisException' with message 'Redis server went away'

    window-exe-redis-2.8.12服务,当你复制好php_igbinary.dll,php_redis.dll时候,你运行redis报错:Fatal error: Uncaught exc ...

  8. Windows 64位下安装Redis详细教程

    方法/步骤 在D盘新建文件夹[redis],右键解压Redis ZIP包,把所有文件解压到redis文件夹中.(其他盘符也可以滴^_^) 文件介绍: redis-benchmark.exe       ...

  9. 对redis客户端jedis2.8.0的进一步封装

    jedis2.8.0的进一步封装: 1.序列化存储对象 2.结合spring,创建redis连接池 3.提供了基础的单个实体操作,有序list操作和一对多关系list的操作,对list提供了分页的封装 ...

随机推荐

  1. asp.net 中日期的格式化显示的方法

    在Asp.net 中经常使用日期,在不同的场合,对日期的显示方式有不同的要求,为此,自己总结了一些日期格式化的方式,仅供学习参考使用: C#格式化日期时间 DateTime dt = DateTime ...

  2. WPF简单数据绑定

    XAML: <!--#region 数据绑定控件--> <DataGrid x:Name="dataGrid" Grid.Column="2" ...

  3. 零基础学习python_列表和元组(10-13课)

    一时兴起今天又回过头来补一下列表和元组,先来说说列表哈,列表其实是python最经常用到的数据类型了,不仅经常用还很强大呢,这个跟C语言里面的数组是类似的,列表当然也可以增删改查,不过我可没打算用之前 ...

  4. nodejs学习笔记<七> 路由

    // 引用模块(与C#中命名空间,Java中引用包同理) var http = require("http"); var path = require("path&quo ...

  5. Jquery在表格中搜索关键字

    <!DOCTYPE html><html><head> <title>ddd</title></head><body> ...

  6. oracle 问题

    OCIEnvCreate 失败,返回代码为 -1,但错误消息文本不可用. 客户端文件没复制全 ORA-01017: invalid username/password; logon denied == ...

  7. VS出现异常?!和十进制转二进制比是小事

    今天被VS的纠错机制下了一小跳. 使用VS时,如果代码出现异常,比如我,运行代码时,出现了无限循环,在调试的时候VS会自动停止运行,并在错误代码行断点提示. 之后会出现一个杂项文件,提示你这里错了.注 ...

  8. Xshell 本地上传、远程下载文件

    1.Xshell登录工具在创建会话的时候,点击最下面的ZMODEM,可以填写下载的路径和加载的路径:2个路径可以一样也可以不一样: 在下载的时候可以下载到相应的路径去.(我设置的是下载前始终询问) 2 ...

  9. js提高篇

    1定义一个方法 function aa(){alert(this)} 对于浏览器 这只是一个方法,那么this是什么的,this理所当然是document对象了..也就是说 打页面定义的方法 都是do ...

  10. ck

    ck