Redis介绍
什么是NoSQL
NoSQL,泛指非关系型数据库,NoSQL即NoT-Only SQL,它可以作为关系型数据库的良好补充。随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速。而传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,例如:
1、High performance - 对数据库高并发读写的需求
web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。其实对于普通的BBS网站,往往也存在对高并发写请求的需求,例如网站的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此这是一个相当普遍的需求。
2、Huge Storage - 对海量数据的高效率存储和访问的需求
类似Facebook,twitter,Friendfeed这样的SNS网站,每天用户产生海量的用户动态,以Friendfeed为例,一个月就达到了2.5亿条用户动态,对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统,例如腾讯,盛大,动辄数以亿计的帐号,关系数据库也很难应付。
3、High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求
在基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,为什么数据库不能通过不断的添加服务器节点来实现扩展呢?
NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
一些主流的NOSQL产品
NOSQL数据库四大分类
1、键值(Key-Value)存储数据库
相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型应用: 内容缓存,主要用于处理大量数据的高访问负载。
数据模型: 一系列键值对
优势: 快速查询
劣势: 存储的数据缺少结构化
2、列存储数据库
相关产品:Cassandra, HBase, Riak
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限
3、文档型数据库
相关产品:CouchDB、MongoDB
典型应用:Web应用(与Key-Value类似,Value是结构化的)
数据模型: 一系列键值对
优势:数据结构要求不严格
劣势: 查询性能不高,而且缺乏统一的查询语法
4、图形(Graph)数据库
相关数据库:Neo4J、InfoGrid、Infinite Graph
典型应用:社交网络
数据模型:图结构
优势:利用图结构相关算法。
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
redis历史发展
2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便 对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。 不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,直到今天。
Salvatore Sanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。Hacker News在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis。国内如新浪微博、街旁网、知乎网,国外如GitHub、Stack Overflow、Flickr等都是Redis的用户。
VMware公司从2010年开始赞助Redis的开发, Salvatore Sanfilippo和Pieter Noordhuis也分别在3月和5月加入VMware,全职开发Redis。
什么是redis
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
- 字符串类型
- 散列类型
- 列表类型
- 集合类型
- 有序集合类型
redis的应用场景
- 缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
- 分布式集群架构中的session分离。
- 聊天室的在线好友列表。
- 任务队列。(秒杀、抢购、12306等等)
- 应用排行榜。
- 网站访问统计。
- 数据过期处理(可以精确到毫秒)
测试环境
- redis需要安装在linux服务器上运行测试,本教程使用 linux虚拟机及ssh客户端进行功能测试。
- 在开发环境(windows)安装ssh客户端,本教程使用SecureCRT作为ssh客户端连接虚拟机。
安装运行redis
redis安装环境
- redis是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境
- 安装redis需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要在线安装gcc:
yum install gcc-c++
redis安装
版本说明
本教程使用redis3.0版本。3.0版本主要增加了redis集群功能。
源码下载
从官网下载http://download.redis.io/releases/redis-3.0.0.tar.gz,将redis-3.0.0.tar.gz拷贝到/usr/local下
安装C语言环境
yum install gcc-c++
(如果已安装就无需再安装)
1、将redis的源码包上传到Linux服务器上
2、在 usr/local下新建文件夹 redis:mkdir /usr/local/redis
3、将root下的redis移动到 /usr/local/redis
mv redis-3.0.7.tar.gz /usr/local/redis/
cd /usr/local/redis
4、解压源码包:tar -zxvf redis-3.0.0.tar.gz
5、进入解压后的目录进行编译
cd /usr/local/redis/
- 进入redis-3.0.0目录,执行make命令
make
6、安装redis
make PREFIX=/usr/local/redis install
(PREFIX参数指定redis的安装目录,安装成功之后 在redis目录下多出来一个bin目录)
7、bin目录结构如下
8、redis.conf
redis.conf是redis的配置文件,redis.conf在redis源码目录。
注意修改port作为redis进程的端口,port默认6379。
9、拷贝配置文件到安装目录下
- 进入源码目录,里面有一份配置文件 redis.conf,然后将其拷贝到安装路径下
cd /usr/local/redis
cp /usr/local/redis-3.0.0/redis.conf /usr/local/redis/bin
10、安装目录bin下的文件列表
redis3.0新增的redis-sentinel是redis集群管理工具可实现高可用。
redis的启动
方式一(前台启动,不推荐)
在bin目录,执行 ./redis-server
默认端口号是6379
方式二(后台启动,推荐)
1、将redis-3.0.7目录下的redis.conf文件复制到 /usr/local/redis/bin 下
cp redis.conf /usr/local/redis/bin/ #此时 bin目录下会多出一个dump.rdb,相当于redis备份
2、修改redis/bin目录下的redis.conf 设置为 后台启动
vim redis.conf
3、进入到编辑redis.conf文件页面后,输入/表示查找
/daemonize
4、将 daemonize 值改成yes即可
5、启动
./redis-server redis.conf
6、查看redis进程
ps aux|grep redis
使用redis的客户端连接redis服务器
方式1:默认连接的本机6379端口
./redis-cli
方式2:连接指定主机 指定端口号
./redis-cli -h 192.168.17.136 -p 6379
-h:连接的服务器的地址
-p:服务的端口号
方式3:图像界面的客户端
在host连接虚拟机中的redis服务,需要关闭防火墙,或者在防火墙的配置文件中开6379端口
如果是图像界面客户端登录redis服务,需要放行6379端口
编辑iptables文件
vim /etc/sysconfig/iptables
放行6379端口
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
保存后重启防火墙
service iptables reload
或者
service iptables restart
关闭防火墙命令
- 即时生效(重启后复原)
service iptables stop
- 永久生效(重启后不会复原)
chkconfig iptables off
关闭服务
- 方式一杀死进程(掌握)–强行终止redis进程可能会导致redis持久化数据丢失
kill -9 pid
- 方式二使用客户端发送关闭命令–正确停止redis服务的方式
1、已经登录客户端执行
cd /usr/local/redis
./bin/redis-cli shutdown
2、 没有登录客户端情况下执行
./redis-cli -h ip地址 -p port shutdown
一共是16个数据库,每个数据库之间是相互隔离。数据库的数量是在redis.conf中配置的。
切换数据库使用命令:select 数据库编号
select 1
redis中数据结构
- redis中存储的数据是以key-value的形式存在的.其中value支持5种数据类型
1、字符串(String) (重点)
2、哈希(hash) (重点)
3、字符串列表(list)
4、字符串集合(set)
5、有序的字符串集合(sorted-set或者叫zset)
-
key不要太长(不能>1024个字节),
-
也不要太短
-
key在项目里面最好统一写法, key的常用的写法:
项目名子模块key名称; crm_user_pwd
存储字符串(掌握)
概述
string是redis最基本的类型,一个key对应一个value。string类型是二进制安全的 。一个键最大能存储512MB,redis数据是保存在内存的
常见命令
设置
set key value
获取
get key
查看当前数据库所有的key
keys *
删除
del key
自增
incr key
自减
decr key
扩展命令
-
getset key value:先获取再设置
-
incrby key count:指定增加数量
-
decrby key count:指定减少数量
-
append key value:追加(若有指定的key 则追加,若无,则设置一个),相当于拼接字符串
存储哈希(hash)类型
概述
- redis中hash 是一个键值对集合
- redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
- Redis存储hash可以看成是String key 和String value的map容器. 也就是说把值看成map集合
常见命令
设置
hset key field value :设置一个键值对
hmset key field1 value1 field2 value2 ... :设置多个键值对
设置多个field
获取
hget key filed:获取存储在哈希表中指定字段的值
hmget key filed1 filed2...:获取多个给定字段的值
hgetall key:获取在哈希表中指定 key 的所有字段和值(了解)
查看多个field
查看多个field里面的值
同时取key和value
删除
hdel key filed1 filed2 ...: 删除指定的字段
hdel key:删除整个hash
扩展命令
-
hlen key 获取哈希表中字段的数量
-
hincrby key filed increment:给指定的子键增加指定的值
-
hkeys key:获取所有哈希表中的字段
-
hvals key:获得所有的value
-
HEXISTS key field:查看哈希表 key 中,指定的字段是否存在。
存储list
概述
redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 2的32 次方- 1 个元素 (4294967295, 每个列表超过40亿个元素)。 特点:有序可重复
ArrayList
单向链表
双向链表
rpoplpush的使用场景
常用命令
两端的插入(没有的话,会创建一个)
lpush key value1 value2...
rpush key value1 value2...
两端的移除(取)
lpop key :左边弹出一个
rpop key :右边弹出一个
查看
lrange key startindex endindex;
eg: lrange key 0 -1 查看所有的
lrange key 0 3; 查看前4个(从左边开始...)
获取列表的个数
llen key: 返回指定key所对应的list中元素个数
了解的命令
lrem key count member:在key中移除指定个数的成员
如果count > 0:从左往右移除指定个数
count < 0:从右往左移除指定个数
count = 0:清空list中指定元素
lset key index value: 通过索引设置列表元素的值. 0代表第一个元素, -1代表尾元素
linsert key before|after pivot value: 在pivot元素前或者元素后插入一个值
rpoplpush resource destination: 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
存储set
概述
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)
特点:无序、唯一
常见命令
使用场景
添加
sadd key member1 member2
移除
srem key member1 member2
查看所有
smembers key
判断一个set中是否有指定的member
sismember key member
聚合运算
sdiff key1 key2: 差集. 我有你没有
sinter key1 key2: 交集.我有你也有
sunion key1 key2: 并集. 我有"加"你有
扩展命令
-
scard key: 获得set中成员的数量
-
srandmember key: 随机返回set的一个成员
-
sdiffstore key1 key2 key3:将差异的部分插入key1
存储sortedset
概述
redis 有序集合(sortedset)和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。
redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
特点: 唯一(成员不可以重复)+有序(按照分数大小进行排序的)
常见命令
添加
zadd key score1 member1 score2 member2...
获得集合成员变量
zcard key
获取元素的得分
zscore key member
删除
zrem key member1 member2...
展示所有元素
zrange key startindex endindex [withscores]; 按照分数的从小到大的顺序展示所有的元素
zrevrange key start stop [withscores]; 按照分数的从大到小的顺序展示所有的元素
key命令
- 设置key的过期时间。
- Expire key second:设置key的过期时间
- Ttl key:查看key的有效期
- Persist key:清除key的过期时间。Key持久化。 -1是永久保存的
注意:如果你看到的key是正数,正在倒计时。如果看到的key是-1 ,说明是永久保存的 -2 说明key不存在
通用操作
-
keys *: 查询所有的key
-
exists key:判断是否有指定的key 若有返回1,否则返回0
-
expire key 秒数:设置这个key在缓存中的存活时间
-
ttl key:展示指定key的剩余时间
- 若返回值为 -1:永不过期
- 若返回值为 -2:已过期或者不存在
-
del key:删除指定key
-
rename key 新key:重命名
-
type key:判断一个key的类型
redis的特性
多数据库性
-
redis默认是16个数据库, 编号是从0~15.
-
select index:切换库
-
move key index: 把key移动到几号库(index是库的编号)
-
flushdb:清空当前数据库
-
flushall:清空当前实例下所有的数据库
服务器命令(自学)
-
ping :测试连接是否存活
-
echo str: 打印内容
-
quit: 退出连接
-
dbsize:返回当前数据库key的数目
-
info:获取服务器信息
订阅发布(观察者模式)
-
subscibe channel: 订阅频道
-
psubscribe *: 批量订阅频道
-
publish channel content:在指定的频道发布内容