Redis与网站架构

Redis与网站架构

什么是Redis?

  • REmote DIctionary Server 缩写 个基于内存的网络存储系统
  • 丰富的数据结构(sets, sorted sets,hashes, list …)
  • 本质是key-value,但是与memcached不同的是,value的类型得到了扩展

    一个普通的问题列表需求

  • 问题本身的数据(标题,投票等等)

  • 问题的作者数据(另 张单独的 张数据表,通过某个键值关联)

  • 问题的标签(本身单独 张数据表,通过 个中间关系表与问题产生 对多的关系)

![redis](C:\Users\gaohj5\Desktop\redis\redis 备课\redis.png)

## 一条sql语句解决问题 too young too simple

## ![sql](C:\Users\gaohj5\Desktop\redis\redis 备课\sql.png)多次查询让你怀疑人生

![一条sql语句](C:\Users\gaohj5\Desktop\redis\redis 备课\一条sql语句.png)

冗余字段过多会让你看起来很傻

![江泽民](C:\Users\gaohj5\Desktop\redis\redis 备课\江泽民.png)

我看还是用Memcached好了 等等,为啥不试试Redis

用Hashes保存字段

$user = array(
'id'
'name'
'mail'
'created' => 1212312312
);
$redis->hMSet(‘user:123’, $user); print_r($redis->hGetAll(‘user:123’));

用Sets保存关系

$questionId = 123;
$tagIds = array(111, 222, 333); foreach ($tagIds as $sort => $tagId) {
$redis->zAdd(‘question_tag:’ . $questionId, $sort, $tagId);
}
print_r($redis->zRange(‘question_tag:123’, 0, -1));

与sql比较

大大减少了查询数量,提高了效率
redis的API更加人性化,再也不需要构 建SQL语句,节省了SQL的解析时间

与Memcached相比

支持哈希存储,存储多个字段时不需要 自己再次用类似json的格式编码和解 码,更新也更加高效
支持列表和集合等多种数据集,可以方
便快捷地处理有序数据

redis

简介

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

Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value string类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

NoSql(非关系型数据库)

mongoDB

CouchDB

Memcached

其他消息队列

RabbitMQ

优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

和其他的key-value存储有什么不同

  • Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
  • Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

  • memcached 的单个key 老版本 1M 新版本 2M 可以通过修改 memcached.h 修改 KEY_MAX_LENGTH 调整单个KEY的大小

  • redis单个key 512M

  • Memcached 是多线程 redis 是单线程

  • Memcached 数据不能持久化 断电数据消失

  • redis可以持久化 因为使用了 RDB和AOF机制

  • memcached 不支持集群 但是支持 Memcached::addServers() 十台组合成1台使用

  • redis支持集群 而且redis 支持库 0-15 16个库

  • memcached 支持key=》value redis有多种数据类型

  • redis 还可以做消息队列 比如聊天室

安装 redis

wget -c http://download.redis.io/releases/redis-3.2.9.tar.gz
tar -zxvf  redis 
mv redis-3.2.9 /usr/local/redis 
cd /usr/local/redis/
make install  


cd /usr/local/redis/src

文件名称 用途
redis-cli redis客户端
redis-server redis服务端
redis-benchmark redis 性能测试工具
redis-check-aof AOF修复工具 因为AOF Redis才能持久化存储
redis-check-rdb RDB检查工具
redis-sentinel 哨兵服务器 2.8以后才有的



启动redis

cd /usr/local/redis/src 

./redis-server
./redis-server -v 查看版本号   
./redis-server /usr/local/redis/redis.conf  制定配置文件启动  以端口号区分redis服务器  

what is RDB 和AOF 她俩让redis 能够持久化存储

RDB是是一个文件 隔一段时间 会在redis 配置文件进行设置 把内容从内存刷入文件中

AOF

将命令追加到文件中 将所有的redis 命令保存为一个文件 重启之后 就要进行新的操作之前的就没用了

常用端口号

http  80
https 443
ftp 21
ssh 22
mysql 3306 
远程桌面 3389
scp 22 
smtp 25
pop3 110 
memcached 11211
redis 默认端口 6379 

vim /etc/sysconfig/iptables 

配置开机启动

1.找到redis 提供的开机启动脚本

/usr/local/redis/utils/redis_init_script

2.复制一份出来

cd utils
cp redis_init_script redis_init_script_6379  #以端口号 区分redis服务器  
  1. 修改redis 启动脚本

    vim redis_init_script_6379
    REDISPORT=6379
    EXEC=/usr/local/redis/redis/src/redis-server
    CLIEXEC=/usr/local/redis/redis/src/redis-cli
    
    PIDFILE=/var/run/redis_${REDISPORT}.pid
    CONF="/usr/local/redis/redis/redis_${REDISPORT}.conf"
    1. 修改redis.conf
    cd /usr/local/redis 
    cp redis.conf  redis_6379.conf
    
    修改daemonize yes 

    5.启动脚本

    /usr/local/redis/redis/utils/redis_init_script_6379 start

    ​6.vim /etc/rc.local

写进来  /usr/local/redis/redis/utils/redis_init_script_6379 start
7. redis-cli直接就可以连接  了  
redis-cli 连接本地  
redis-cli -h 127.0.0.1 -p 6379 

redis的数据类型

string hash list set zset

string(字符串 )redis基本数据类型

一个key 对应 一个 value

set name kuanlijun  设置  

get name  获取   

del name  删除

set  num 10

incr num  自增1   

decr num 自减一 

incrby  num 5  指定增加 5  必须是正整数 

decrby  num 5  指定减5  

incrbyfloat  num 0.5    制定累加小数  
decrbyfloat  

append  num  xiaokeai    累加值  累加到后面     

num 是  key 名     


一个键最大存储 512M

hash 键值对的集合

HMSET user:1  username gebilaowang password 123456 size 50

HGETALL user:1  

user:1 是键值    
1 是id 通过id 区分  通常 使用  incr 键名  获取   id

每个 hash 能存放 2的32次方 减一 40多亿个 键值对

list 列表

添加一个元素 从列表的头部(左) 或者 尾部(右 )

lpush test redis 
lpush test redis1 
lpush test redis2
想象成一个杯子  
lrange test 0 2 
#0 表示开始位置   2 结束位置    

lpop test  从开头弹出来    

lrange test 0 -1 表示查出所有  


 rpush names jinlong 
  rpush names jinlong1
   rpush names jinlong2

   lrange names 0 -1 

   先进先出       就像一个吸管  
   rpop names  从尾部弹出来  



list 列表 可以存放多少元素 2的32次方 减一 个元素

set string类型集合(无序)是通过hash表实现的 增删查 复杂度 都是0(1)

sadd 添加一个string 元素 到key 对应的set 集合中 成功返回 1 失败返回 0 对应set 不存在返回 错误

sadd name  redis 
返回 1 
sadd  name redis1
返回1 
sadd  name redis  
返回 0
smembers name

zset 有序集合

zadd names 0 minghui 
zadd names 0 minghui1
zadd names 1 minghui2
zadd names 2 minghui3

zrangebyscore names 0 2

输出  minghui minghui1 minghui2 


​ ​











猜你喜欢

转载自blog.csdn.net/personalm/article/details/74599105
今日推荐