天天看点

redis内存数据库

===> Redis内存数据库简介:

                 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

===> Redis 的特点:

            ->基于内存

    -> 持久化: RDB、AOF

            -> 消息机制:支持String,只支持Topic的消息(广播)  

            -> 丰富的数据类型

            -> 支持简单的事务

            -> 支持主从复制

            -> HA(哨兵): 对版本有要求,需要 2.4 版本以上

===> Redis的安装和配置: 需要gcc的编译器

            -> Redis 单机部署:

<code>        </code><code>tar </code><code>-</code><code>zxvf redis</code><code>-</code><code>3.0</code><code>.</code><code>5.tar</code><code>.gz        </code>

<code>        </code><code>make</code>

<code>        </code><code>make PREFIX</code><code>=</code><code>/</code><code>app</code><code>/</code><code>redis install</code>

            -&gt; Redis的相关命令

                    redis-benchmark       提供的一个压力测试工具,模拟:10万操作

                    redis-check-aof       检查AOF日志文件

                    redis-check-dump      检查RDB快照文件

                    redis-cli                     命令行

                    redis-sentinel        哨兵(Redis的HA) -----&gt; 配置文件:sentinel.conf 2.4版本以上

                    redis-server      服务器

            -&gt; 配置文件    

                    --- redis.conf

                            daemonize yes  改成yes 后,启动后会在后台运行

                            port 6379

            -&gt; 服务启动命令:redis-server conf/redis.conf

            -&gt; 客户端连接命令: redis-cli -p 6379  |  redis-cli  -h 192.168.10.210 -p 6379

===&gt; Redis 集群的安装和配置:(星型架构,线型架构)

            -&gt; 此处只讲解星型架构(此架构结构为单台服务器上使用不同端口启动三个服务组成集群,多台服务器同理)

                --- 主:6379端口               (关闭 RDB 和 AOF)

                --- 从:6380, 6381端口  (开启 RDB 和 AOF)

            -&gt; 配置文件:

<code>    </code><code>redis6379.conf</code>

<code>    </code><code>daemonize yes</code>

<code>    </code><code>#save 900 1</code>

<code>    </code><code>#save 300 10</code>

<code>    </code><code>#save 60 10000</code>

<code>            </code> 

<code>    </code><code>pidfile </code><code>/</code><code>app</code><code>/</code><code>redis</code><code>/</code><code>pids</code><code>/</code><code>redis_6379.pid</code>

<code>    </code><code>logfile </code><code>"/app/redis/logs/redis_6379/redis.log"</code>

<code>    </code><code>dbfilename dump.rdb</code>

<code>    </code><code>dir</code> <code>"/data/redis_data/redis_6379"</code>

<code>        </code> 

<code>    </code><code>appendonly no</code>

<code>    </code><code>appendfilename </code><code>"appendonly6379.aof"</code>

<code>    </code><code>redis6380.conf</code>

<code>    </code><code>port </code><code>6380</code>

<code>    </code><code>slaveof </code><code>192.168</code><code>.</code><code>157.11</code> <code>6380</code>

<code>    </code><code>pidfile </code><code>/</code><code>app</code><code>/</code><code>redis</code><code>/</code><code>pids</code><code>/</code><code>redis_6380.pid</code>

<code>    </code><code>logfile </code><code>"/app/redis/logs/redis_6380/redis.log"</code>

<code>    </code><code>dir</code> <code>"/data/redis_data/redis_6380"</code>

<code>    </code><code>appendonly yes</code>

<code>    </code><code>appendfilename </code><code>"appendonly6380.aof"</code>

<code>    </code><code>redis6381.conf</code>

<code>    </code><code>port </code><code>6381</code>

<code>    </code><code>slaveof </code><code>192.168</code><code>.</code><code>157.11</code> <code>6379</code>

<code>    </code><code>pidfile </code><code>/</code><code>app</code><code>/</code><code>redis</code><code>/</code><code>pids</code><code>/</code><code>redis_6381.pid</code>

<code>    </code><code>logfile </code><code>"/app/redis/logs/redis_6381/redis.log"</code>

<code>    </code><code>dir</code> <code>"/data/redis_data/redis_6381"</code>

<code>    </code><code>appendfilename </code><code>"appendonly6381.aof"</code>       

                 (*)注意:默认:从节点只读

<code>(error) READONLY You can't write against a read only slave.</code>

<code>修改参数:</code>

<code>slave</code><code>-</code><code>read</code><code>-</code><code>only yes</code>

            -&gt; Redis的HA:哨兵机制(要在解压的安装包中copy sentinel.conf 文件到 /conf 目录下)

<code>      </code><code>sentinel monitor mymaster  </code><code>192.168</code><code>.</code><code>10.210</code>  <code>6379</code>  <code>1</code>

<code>      </code><code>#                              IP            端口   哨兵个数</code>

<code>      </code><code>sentinel auth</code><code>-</code><code>pass</code>  <code>&lt;master</code><code>-</code><code>name&gt;  &lt;password&gt;</code>

<code>      </code><code># 配置连接主节点的密码</code>

<code>      </code><code>sentinel down</code><code>-</code><code>after</code><code>-</code><code>milliseconds  mymaster  </code><code>30000</code>

<code>      </code><code># 表示 30 秒内如果没有收到主节点的心跳,哨兵就认为主节点down</code>

<code>      </code><code>sentinel  parallel</code><code>-</code><code>syncs  mymaster </code><code>1</code>

<code>      </code><code># 选举出新的主节点后,可以同时连接其他从节点的个数</code>

<code>      </code><code>sentinel  failover</code><code>-</code><code>timeout  mymaster  </code><code>180000</code>

<code>      </code><code># 失败切换时,允许的最大时间</code>

                    ---哨兵启动命令:redis-sentinel sentinel.conf

            -&gt; Redis的分片:

                    ---Twemproxy 是一种代理分片机制, 由 Twitter 开源

                        Twemproxy 作为代理,可接受来自多个程序 的访问,按照路由规则,转发给后台的各个 Redis 服务器, 再原路返回

                    --- 安装Twemproxy

<code>       </code><code>git clone https:</code><code>/</code><code>/</code><code>github.com</code><code>/</code><code>twitter</code><code>/</code><code>twemproxy.git</code>

<code>       </code><code>cd twemproxy</code><code>/</code>

<code>       </code> 

<code>       </code><code>CFLAGS</code><code>=</code><code>"-ggdb3 -O0"</code> <code>autoreconf </code><code>-</code><code>fvi &amp;&amp; .</code><code>/</code><code>configure </code><code>-</code><code>-</code><code>prefix</code><code>=</code><code>/</code><code>app</code><code>/</code><code>proxy </code><code>-</code><code>-</code><code>enable</code><code>-</code><code>debug</code><code>=</code><code>log &amp;&amp; make &amp;&amp;  make install</code>

                    --- 配置文件:nutcracker.yml  (需要在解压的安装包/conf 目录下copy 到安装目录的 conf 目录下)

<code>       </code><code>alpha:</code>

<code>       </code><code>listen: </code><code>127.0</code><code>.</code><code>0.1</code><code>:</code><code>22121</code>

<code>       </code><code>hash</code><code>: fnvla_64</code>

<code>       </code><code>distribution: ketama</code>

<code>         </code><code>auto_eject_hosts: true</code>

<code>         </code><code>redis: true</code>

<code>         </code><code>server_retry_timeout: </code><code>2000</code>

<code>         </code><code>server_failure_limit: </code><code>1</code>

<code>         </code><code>servers:</code>

<code>         </code><code>-</code> <code>192.168</code><code>.</code><code>10.210</code><code>:</code><code>6380</code>

<code>         </code><code>-</code> <code>192.168</code><code>.</code><code>10.210</code><code>:</code><code>6381</code>

                    --- 检查配置文件是否正确:  ./nutcracker  -t  conf/nutcracker.yml

                    --- 启动代理服务器: ./nutcracker -d -c  conf/nutcracker.yml

                    --- 此时连接Redis 需要使用 Twemproxy 配置的端口连接: redis-cli  -p  22121

===&gt; Redis的操作:基于key-value形式 

            -&gt; 

                    --- 

===&gt; Redis的事务: 不是真正的事务

            -&gt; Redis的事务的本质:将一组操作放入队列中,批量执行

            -&gt; 对比Oracle和Redis的事务

            -&gt; Redis 的事务实例:(银行转账)

<code>      </code><code>set</code> <code>tom </code><code>1000</code>

<code>      </code><code>set</code> <code>mike </code><code>1000</code>

<code>      </code><code>multi</code>

<code>      </code><code>decrby tom </code><code>100</code>

<code>      </code><code>incrby mike </code><code>100</code>

<code>      </code><code>exec</code>

===&gt; Redis的锁机制

            -&gt; 核心:当事务提交的时候,如果监控的值,发生变化,则提交失败

         命令:watch

            -&gt; Redis 的锁实例:(买票)

<code>      </code><code>set</code> <code>ticket </code><code>1</code>        

<code>          </code> 

<code>      </code><code>用户一:tom</code>

<code>      </code><code>decr ticket</code>

<code>      </code><code>exec</code>  <code>-</code><code>-</code><code>-</code><code>-</code><code>-</code><code>-</code><code>-</code><code>&gt; 提交的时候,慢了一点</code>

<code>      </code><code>1</code><code>) (integer) </code><code>-</code><code>1</code>   <code>=</code><code>=</code><code>=</code><code>=</code><code>&gt; 票数不可能是</code><code>-</code><code>1</code>

<code>      </code><code>2</code><code>) (integer) </code><code>900</code>

<code>      </code><code>用户二:在tom提交前,已经把票买走了  </code>

===&gt; Redis的消息机制

            -&gt; Redis 消息系统类型

                    --- 同步消息系统:需要对方的回答

                    --- 异步消息系统:不需要等待对方回答

            -&gt; Redis 消息类型

                    --- Queue: 队列(点对对)

                    --- Topic: 主题 (广播)

                    (*)Redis和Kafka:只支持Topic

                    (*)  JMS: Java Message Service ----&gt; 都支持:Queue和Topic

 推荐:Weblogic

            -&gt; Redis 消息相关命令

                    publish: 发布消息 指定频道

                    subscribe:订阅消息 指定频道

                    psubscribe:订阅消息 使用通配符指定频道

===&gt; Redis的持久化:  RDB、AOF

            -&gt; 持久化作用:进行恢复

            -&gt; RDB:快照的方式。每隔一段时间,把内存中的数据写到rdb文件中

                    --- 优点:恢复的速度快

                    --- 缺点:如果在两次RDB之间发生了掉电,数据肯定丢失

                    --- 参数:

                            规则:从下往上

                            save 900 1      在15分钟内,如果有1个key的value发生了变化,就产生RDB文件

                            save 300 10     在5分钟内,如果有10个key的value发生了变化,就产生RDB文件

                            save 60 10000   在60秒内,如果有1w个key的value发生了变化,就产生RDB文件

                            stop-writes-on-bgsave-error yes 如果在写RDB文件的时候产生了错误,停止新的数据写入

                            rdbcompression yes 是否压缩(优点:节约了空间  缺点:恢复的效率低),可以设置为:no

                            rdbchecksum yes  校验和来检查RDB文件是否是好的

                            dbfilename dump.rdb  如果在集群下,一台主机上运行多个Redis的实例,建议区别rdb文件

                            dir ./    保存的目录

            -&gt; AOF:append only file(记录日志)

                    --- 优点:数据安全性高

                    --- 缺点:恢复速度慢,需要重做日志,达到恢复的目的

                    --- 默认禁用

<code>        </code><code>appendonly no  </code><code>=</code><code>=</code><code>=</code><code>&gt; yes     </code><code>#开启AOF                </code>

<code>        </code><code>appendfilename </code><code>"appendonly.aof"</code>  <code># 如果在集群下,一台主机上运行多个Redis的实例,建议区别aof文件</code>

<code>                  </code> 

<code>        </code><code># 什么时候记录日志???</code>

<code>        </code><code># appendfsync always  # 每个操作都记录日志。最安全,性能最差</code>

<code>        </code><code>appendfsync everysec  </code><code># 默认:每秒</code>

<code>        </code><code># appendfsync no      # 由操作系统决定</code>

<code>        </code><code>no</code><code>-</code><code>appendfsync</code><code>-</code><code>on</code><code>-</code><code>rewrite no </code><code># 重写发生的时候,是否写入aof的新日志</code>

<code>        </code><code># 什么时候执行AOF重写?</code>

<code>        </code><code>auto</code><code>-</code><code>aof</code><code>-</code><code>rewrite</code><code>-</code><code>percentage </code><code>100</code>

<code>        </code><code>auto</code><code>-</code><code>aof</code><code>-</code><code>rewrite</code><code>-</code><code>min</code><code>-</code><code>size </code><code>64mb</code>

<code>                            </code> 

<code>        </code><code># 什么是AOF的重写:rewrite</code>

<code>        </code><code>set</code> <code>i </code><code>0</code>

<code>        </code><code>incr i</code>

<code>                                </code><code>=</code><code>=</code><code>=</code><code>=</code><code>=</code><code>=</code><code>&gt; 问题: AOF文件太大了</code>

<code>        </code><code>100</code><code>次</code>

<code>        </code><code>*</code><code>*</code><code>*</code><code>*</code>

<code>        </code><code>最终:i </code><code>=</code> <code>100</code>

<code>                </code> 

<code>        </code><code># 演示:AOF的重写</code>

<code>        </code><code>模拟:</code><code>10</code><code>万个操作</code>

<code>        </code><code>bin</code><code>/</code><code>redis</code><code>-</code><code>benchmark </code><code>-</code><code>n </code><code>100000</code>        

===&gt; Redis 问题链接:(找了几个比较经典的问题处理链接,留作收藏,以后备用)

            -&gt; http://blog.csdn.net/a491857321/article/details/52006376

本文转自 菜鸟的征程 51CTO博客,原文链接:http://blog.51cto.com/songqinglong/2066611