Redis小结

2016-08-02 23:03:54 Redis 3173 0

Redis

简介

一个通过 内存 存取数据的 key-value 数据库
常用的是它的链表与集合的数据结构
当然除了 redis ,我们平时的应用离不开它与 Mysql 的结合

主要功能

用来提速,因为内存读取比硬盘读取 速度要快很多
里面只放使用频繁、用户操作量较大的数据、用户近期使用的数据

与Mysql的关系

短期内经常查询的数据[热数据],通过 redis 查; 不常用部分的[冷数据],通过 Mysql

应用场景

队列 -> 消息队列
原子计数 -> 生成自增 ID
数据存于内存中 -> 用作缓存
...

应用方式

先存入 Mysql 再存入 Redis

能保证数据实时存入,但 Mysql 写的压力较大

先存入 Redis 再定一个时间间隔去拉取完成当前操作的时间戳前,将期间所有未存入 Mysql 的数据,存如 Mysql

不能保证遇到特殊情况时,防止 Redis 自身也未运用实时备份时的数据丢失的情景

字符串 string

特点:简洁,常用于存用户信息
常用操作方法

key-value数据库设计

常用方式,类比 Mysql 数据库设计, 如

表名:字段名:字段值
示例一

user 表,里面的字段有 username, uid, password
带有 $ 表示 php 中的变量

$uid = $r->incr("uid"); // 自增变量  
Key                      Value        备注
user:uid:$uid:username   $username    根据用户uid查名字
user:uid:$uid:password   $password    根据用户uid查密码
user:$username           $uid         根据用户名查密码
场景

已知用户名 $username 密码 $password 查帐号密码是否正确

步骤一
$uid=$r->get("user:$username");
步骤二
$find_key = $r->keys("user:uid:$uid*"); // 其中*表示匹配任意多个字符
if(empty($find_key)){
  echo "帐号或者密码错误";//帐号不存在
}else{
$nameMix = "user:".$uid.":username";
$pwdMix  = "user:".$uid.":pwd" ;
$get_user_info=array(
     $nameMix,
     $pwdMix
);
$find = $r->mget($get_user_info);
if($name == $find[0] && $pwd  == $find[1]){
  echo "欢迎您,$username!";
}else{
  echo "帐号或者密码错误";
}

链表 list

特点:常用来做消息推送

这里的消息推送是指,判断是否发送成功,系统成功接收到消息,就返回确认信息给发送端
然后就把推送的过程留给服务器,在后台进行

推送可以用到优先级,关注越早(可以通过 zsort 实现),越优先

常用队列解决优先级的问题,如

lpush 可以形成一个从左往右的队列
rpush 可以使得一个新的数据插入队列的顶部,用于解决进程优先级的问题

注意:队列一般不给予定点删除功能

集合 set

特点:交集、并集、差集、不重复,可以通过 sort 排序

1)粉丝粉主关系
2)防止事件重复

哈希 hash

特点:类似于二维数组的存取

排序集 zset

特点:排序方便,如果熟练set方法的排序,这个就不用研究了

常用操作

目前我做了一个小案列关于具体操作的,微博逻辑大概就是这个样子
链接:http://pan.baidu.com/s/1slMSrqH 密码:9u5b

更新时间 2016年8月2日 23:48:06
这里讲php中常用方法
static $r; // 初始的时候定义为静态变量
$r = new Redis();
$r->connect("127.0.0.1","6379");
// 如果有密码
// $r->auth("密码");
$r->select(1);

如果是查询的 string 型,模糊查找 user:uid:$uid 的数据,查找 user:uid:$uid:age 的各自年龄

$find_array = $r->keys("user:uid:*");
$count = count($find_array);// 找到到的个数
for($i=0 ; $i < $count ; $i++){
  $keyMix[$i]="user:uid:$find_array[$i]:age";
}
$result_array = $r->mget($find_array);
print_r($result_array);

其他类型的常用尝试
...

Redis的AOF

进入 redis 的安装后的配置文件 redis.conf

vim /usr/local/redis/etc/redis.conf
0)设置AOF类型,这里设置精准持久化(每次数据变更都会自动备份,当数据量大的时候换类型)
appendfsync everysec
1)你应该会看到
save 900 1
save 300 10
save 60 10000

比如,第一行,表示900秒内,如果超过1个key被修改,就发起快照保存
后两行同理,这三行表示三种方案,不同情况不同处理

2)你应该会看到

备份的数据名称

dbfilename dump.rdb

备份数据的路径

dir /usr/local/redis/var
3)如果你是在本地输入的数据,想将dump.rdb文件弄到服务器上

此间要求:本地的 redis 版本,不能高于服务器版本的 redis,否则 dump.rdb 不能被读取

主从配置

为了防止意外发生,请各个服务器统一 redis版本!!!

1) 开放服务器对应的redis端口
iptables -A INPUT -p tcp --dport 6379 -j ACCEPT
service iptables save
2) 进入redis的安装后的配置文件redis.conf
vim /usr/local/redis/etc/redis.conf
3) 找到# requirepass foobared这行下面添加密码,比如设为hlz
# requirepass foobared
# 配置该服务器密码
requirepass hlz
4) 配置主服务器(master)
主服务器(115.159.56.128:6379)

配置步骤3)中的密码

设置 slave 权限:一般情况=>从服务器=>只读,不可写

slave-read-only yes
从服务器

redis.conf 中,找到

slaveof <masterip> <masterport>

示例如下,填写对应的主服务器的ip与端口

slaveof 115.159.56.128 6379

再在 redis.conf 中,找到

masterauth <master-password>

输入主服务器的密码

masterauth hlz

现在就完成主从配置了

关于主从配置的分布式使用,我们可以用http://blog.csdn.net/cywosp/article/details/23397179/

待更新

解决跨域请求

待有空时,再更新

后续

我建议在 windows 下编程, 通过与虚拟机共享文件夹,完成虚拟机环境下的实时测试

Windows下安装redis环境讲解

http://blog.csdn.net/myboyli/article/details/52082050

Linux下安装redis环境讲解

待更新

php操作redis的函数总结

http://blog.csdn.net/myboyli/article/details/52090452

注:若无特殊说明,文章均为云天河原创,请尊重作者劳动成果,转载前请一定要注明出处