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服务器
修改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"
- 修改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