文章目录
- 一、什么是NoSQL?
- 二、NoSQL的特性?
- 三、什么是Redis?
- 四、Redis安装部署
- 1.1 下载安装 Redis
- 1.2 修改配置文件
- 1.3 启动 Redis
- 1.4 客户端连接:
- 1.5 停止 redis 服务
- 五、Redis 常用命令
- 1 string 类型及操作
- 2 hash 类型及操作
- 3 list 类型及操作
- 4 Set类型及操作
- 5 zset 类型及操作
- 六、Redis高级应用
- 1 密码防护
- 2 主从同步
- 2.1 主从服务器安装好服务
- 2.2 主服务器配置
- 2.3 从服务器配置
- 2.4 重启从服务器,然后测试
- 3、数据持久化
- 1 snapshotting(快照)--默认方式
- 2 append-only file(缩写aof)
- 3 测试
一、什么是NoSQL?
NoSQL(NoSQL = Not Only SQL ),意为反SQL运动,是一项全新的数据库革命性运动,2000年
前就有人提出,发展至2009年趋势越发高涨。它是指运用非关系型的数据存储,相对于铺天盖地的
关系型数据库运用,这一概念无疑是一种全新的思维的注入。
随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并
发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的
数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集
合多重数据种类带来的挑战,尤其是大数据应用难题。
分类 | 举例 | 典型应用场景 | 数据模型 | 优点 |
键值(key-value) | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 | Key 指 向 Value 的键值对,通常用hash table 来实现 | 查找速度快 |
列存储数据库 | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 |
文档型数据库 | CouchDB, MongoDb | Web 应 用 ( 与Key-Value 类似,Value 是结构化的,不同的是数据库能够了解 Value 的内容) | Key-Value 对应的键值对,Value 为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 |
图形(Graph)数据库 | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N 度关系查找等 |
二、NoSQL的特性?
NoSQL是key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本
要求,比如说遵循SQL标准、ACID属性、表结构等等。
这类数据库主要有以下特点:
1. 非关系型的、分布式、开源的、水平可扩展的
2. 处理超大量数据
3. 击碎了性能瓶颈
4. 对数据高并发读写
5. 对海量数据的高效率存储和访问
6. 对数据的高扩展性和高可用性
三、什么是Redis?
Redis是一个开源的,先进的key-value存储。它通常被称为数据结构服务器,因为键可以包含string
(字符串)、hash(哈希)、list(链表)、set(集合)和zset(sorted-set–有序集合)。这些数据类
型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作。
Redis和Memcached类似,它支持存储的value类型相对更多,与memcached一样,为了保证效
率,数据都是缓存在内存中,区别是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追
加的记录文件,并且在此基础上实现了master-slave(主从)同步。
四、Redis安装部署
Redis 的官方网站是:http://redis.io
1.1 下载安装 Redis
[root@server ~]# wget http://download.redis.io/releases/redis-2.8.6.tar.gz #下载 redis
[root@server ~]# tar -xf redis-2.8.6.tar.gz
[root@server ~]# cd redis-2.8.6/
[root@server ~]# yum -y install gcc* #安装gcc*
[root@server redis-2.8.6]# make
[root@server redis-2.8.6]# make PREFIX=/usr/local/redis install #编译安装并指定安装目录
[root@server redis-2.8.6]# mkdir /usr/local/redis/etc #创建redis配置目录
[root@server redis-2.8.6]# cp redis.conf /usr/local/redis/etc/ #复制配置文件到指定目录方便管理
1.2 修改配置文件
[root@server redis-2.8.6]# vim /usr/local/redis/etc/redis.conf
1.3 启动 Redis
[root@server redis-2.8.6]# ln -s /usr/local/redis/bin/* /usr/local/bin/ #连接到bin下方便使用命令
[root@server redis-2.8.6]# redis-server /usr/local/redis/etc/redis.conf #启动redis服务
1.4 客户端连接:
redis-cli
-h IP:连接指定的redis服务器
-p 6379:指定redis服务器的端口
-a 密码:使用密码登录
-n 数据库号:指定连接哪个数据库
--raw:redis支持存储中文
1.5 停止 redis 服务
[root@server redis-2.8.6]# redis-cli shutdown
或
[root@server redis-2.8.6]# pkill -9 redis
五、Redis 常用命令
都是键值对的形式存在
1 string 类型及操作
string 是最简单的类型,一个 key 对应一个 value,string 类型是二进制安全的。redis 的 string 可以包含任何数据。
1.1 set设置 key 对应的值为 string 类型
例如:添加 name = lisi 的键值
127.0.0.1:6379> set name lisi
OK
1.2 setnx设置key对应的值为string类型,如果key已经存在,设置失败返回0,设置成功返回 1
127.0.0.1:6379> SETNX name zs
(integer) 0
127.0.0.1:6379> SETNX age zs
(integer) 1
1.3 get
获取key对应的string值,存在返回值,如果key不存在返回nil
127.0.0.1:6379> get name
"lisi"
127.0.0.1:6379> get abc
(nil)
1.4 mset & mget同时设置和获取多个键值对
127.0.0.1:6379> mset id 1 name zs sex man
OK
127.0.0.1:6379> mget id name sex
1) "1"
2) "zs"
3) "man"
1.5 incrby对key的值做加加(指定值)操作,并返回新的值
例如:对 id 进行 +2 和 -2
127.0.0.1:6379> INCRBY id 2
(integer) 3
127.0.0.1:6379> get id
"3"
127.0.0.1:6379> INCRBY id -2
(integer) 1
127.0.0.1:6379> get id
"1"
1.6 del删除一个已创建的key
例如:删除 name 的key
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
2 hash 类型及操作
Redis hash 是一个 string 类型的 field(字段)和 value 的映射表,它的添加、删除操作都是 0(1)平均;hash 特别适合用于存储对象,相较于将对象的每个字段存成单个 string 类型,将一个对象存储在 hash 类型中会占用更少的内存,并且可以更方便的存取整个对象。
2.1 hset & hmset
hset 表名 字段名 值
hset 表名 字段名 值 字段名 值
2.2 hset & hmset设置 hash field 为指定值,如果 key 不存在,则先创建
hset设置表的一个值,hmset设置表的多个值
例如:为 a1 表创建一个叫 name 字段(key),键值是 list ,age 字段键值是 20
127.0.0.1:6379> hset a1 name lisi
(integer) 1
127.0.0.1:6379> hmset a2 name zhangsan age 20
OK
2.3 hget & hmgethset 查看表的一个值,hmset 查看表的多个值
127.0.0.1:6379> hget a1 name
"lisi"
127.0.0.1:6379> hmget a2 name age
1) "zhangsan"
2) "20"
2.4 hdel删除一个键值
127.0.0.1:6379> hdel a2 age
(integer) 1
127.0.0.1:6379> hget a2 age
(nil)
2.5 hgetall列出 a2 表内所有键值
127.0.0.1:6379> hgetall a2
1) "name"
2) "zhangsan"
3 list 类型及操作
list 是一个链表结构,主要功能是 push、pop、获取一个范围内的所有值等等,操作中 key 理解为链表的名字。Redis 的 list 类型其实就是一个每个子元素都是 string 类型的双向链表。我们可以通过push、pop 操作从链表的头部或尾部添加删除元素。
3.1 lpush在key对应list的头部添加字符串元素
lpush 链表名 元素
127.0.0.1:6379> lpush lisi lisi
(integer) 1
127.0.0.1:6379> lpush lisi 18
(integer) 2
127.0.0.1:6379> lpush lisi man
(integer) 3
3.2 lrange从指定链表中获取指定范围的元素
0 -1 代表查看所有元素
127.0.0.1:6379> lrange lisi 0 -1
1) "man"
2) "18"
3) "lisi"
3.3 lpush、rpush、lpop、rpop、lrange 详见图示
4 Set类型及操作
set是集合,他是string类型的无序集合。Set是通过hash table实现的,对集、交集、差集。通 过这些操作我们可以实现社交网站中的好友推荐tag功能。集合不允许有重复值。
4.1 sadd 集合名称 元素添加一个或多个元素到集合中
例如:添加 6 个数到 mset 集合
127.0.0.1:6379> sadd mset 1 2 3 4 5 6
(integer) 6
4.2 smembers获取 mset 集合所有元素
127.0.0.1:6379> smembers mset
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
4.3 srem 集合名称 元素指定删除一个或多个元素,并返回显示删除几个元素
例如指定删除 2 3 元素
127.0.0.1:6379> srem mset 2 3
(integer) 2
127.0.0.1:6379> smembers mset
1) "1"
2) "4"
3) "5"
4) "6"
4.4 spop 集合名称随机删除一个元素,并返回删除了那个元素
127.0.0.1:6379> spop mset
"4"
127.0.0.1:6379> smembers mset
1) "1"
2) "5"
3) "6"
4.5 scard 集合名称获取 mset 几个的元素个数
127.0.0.1:6379> scard mset
(integer) 3
4.6 sdiff返会两个集合的差集
127.0.0.1:6379> sadd qq1 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd qq2 3 4 5 6
(integer) 4
127.0.0.1:6379> sdiff qq1 qq2 #以集合 1 为参考
1) "1"
2) "2"
127.0.0.1:6379> sdiff qq2 qq1 #以集合 2 为参考
1) "5"
2) "6"
4.7 sinter获取两个集合的交集
127.0.0.1:6379> sinter qq1 qq2
1) "3"
2) "4"
4.8 sunion获取两个集合的并集
127.0.0.1:6379> sunion qq1 qq2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
5 zset 类型及操作
zset 是 set 的一个升级版本,它在 set 的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset 会自动重新按新的值调整顺序。可以理解为有两列的 mysql 表,一列存的 value,一列存的顺序。操作中 key 理解为 zset 的名字。
5.1 zadd
向一个指定的有序集合中添加元素,每一个元素会对应的有一个分数。你可以指定多个分数/成员组合。如果一个指定的成员已经在对应的有序集合中了,那么其分数就会被更新成最新的,并且该成员会重新调整到正确的位置,以确保集合有序。分数的值必须是一个表示数字的字符串。
zadd 集合名 元素1值 元素1值 元素2属性 元素2属性 元素3值 元素3属性
127.0.0.1:6379> zadd zset 2 zhangsan 1 lisi 1 wanger
(integer) 3
5.2 zrange
返回有序集合中,指定区间内的成员。其中成员按照score(分数)值从小到大排序。具有
相同score值的成员按照字典顺序来排列。
127.0.0.1:6379> zrange zset 0 -1 withscores
1) "lisi"
2) "1"
3) "wanger"
4) "1"
5) "zhangsan"
6) "2"
注: withscores返回集合中元素的同时,返回其分数(score)
5.3 zrem 集合名称 集合里的值删除有序集合中指定的值
127.0.0.1:6379> zrem zset zhangsan
(integer) 1
127.0.0.1:6379> zrange zset 0 -1 withscores
1) "lisi"
2) "1"
3) "wanger"
4) "1"
5.4 zrcrd返回集合中的元素个数
127.0.0.1:6379> zcard zset
(integer) 2
5.5 其他相关命令
命令 含义
> 1. keys #按照键名查找指定的键。支持通配符(*?等)
> 2. exists #确认一个键是否存在(1表示存在)
> 3. del #删除一个键(通用)
> 4. expire #设置一个键(已存在)的过期时间,如果键已经过期,将会被自动删除
> 5. ttl #以秒为单位返回指定键的剩余有效时间 当key 不存在时返回-2 。
#当key 存在但没有设置剩余生存时间返回-1 。 否则,以秒为单位,返回key 的剩余生存时间。
> 6. select #选择一个数据库,默认连接的数据库是0,可以支持共16个数据库。在配置文件中通过 databases 16 关键字定义。
> 7. move #将当前数据库的键移动到指定的数据库中
> 8. type #返回键的类型
> 9. dbsize #返回当前库中键的数量(所有类型)
> 10. save #保存所有的数据。很少在生产环境直接使用SAVE 命令,它会阻塞所有的客户端的请求,可以使用 BGSAVE 命令代替
#如果在BGSAVE命令的保存数据的子进程发生错误的时,用 SAVE 命令保存最新的数据是最后的手段。
> 11. info #获取服务器的详细信息
> 12. config get#获取redis服务器配置文件中的参数。支持通配符
> 13. flushdb #删除当前数据库中所有的数据
> 14. flushall #删除所有数据库中的所有数据
六、Redis高级应用
1 密码防护
给redis服务器设置密码
[root@server ~]# vim /usr/local/redis/etc/redis.conf
#修改配置文件
#requirepass foobared
改为
requirepass 123123
2、重启redis
[root@server ~]# pkill redis
[root@server ~]# redis-server /usr/local/redis/etc/redis.conf
3、客户端登录
[root@server ~]# redis-cli -a 123123
或 交互模式下使用[ auth 密码 ]命令
2 主从同步
Redis主从复制过程:
➢Slave与master建立连接,发送sync同步命令
➢Master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写
命令并缓存。
➢后台完成保存后,就将此文件发送给slave
➢Slave将此文件保存到硬盘上
2.1 主从服务器安装好服务
(iptables&SELinux关闭)
[root@client ~]# wget http://download.redis.io/releases/redis-2.8.6.tar.gz
[root@client ~]# tar -xf redis-2.8.6.tar.gz
[root@client ~]# cd redis-2.8.6/
[root@client redis-2.8.6]# yum -y install gcc*
[root@client redis-2.8.6]# make
[root@client redis-2.8.6]# make PREFIX=/usr/local/redis install
[root@client redis-2.8.6]# mkdir /usr/local/redis/etc
[root@client redis-2.8.6]# cp -a redis.conf /usr/local/redis/etc/
[root@client redis-2.8.6]# ln -s /usr/local/redis/bin/* /usr/local/bin/
2.2 主服务器配置
(给自己设置好密码即可)
3. daemonize no
改为
daemonize yes
4. # requirepass foobared
改为 #设置密码
requirepass 123123
5. # bind 127.0.0.1
改为 #本机IP
bind 192.168.154.10
[root@server ~]# redis-server /usr/local/redis/etc/redis.conf
#启动服务
2.3 从服务器配置
用来连接主服务器
daemonize no
改为
daemonize yes
slaveof <masterip> <msterport>
改为 #主服务器的IP和端口
slaveof 192.168.154.10 6379
masterauth <masterpass>
改为 #主服务器的密码(主服务器要设置好密码)
masterauth 123123
2.4 重启从服务器,然后测试
(可通过info命令获取当前服务器身份类型)
老版本:
从: slaveof #主服务器的IP和端口
masterauth
#主服务器的密码(主服务器要设置好密码)新版本redis 5.* 以上:
从: replicaof #主服务器的IP和端口
masterauth
3、数据持久化
Redis是一个支持持久化的内存数据库,也就是说需要经常将内存中的数据同步到硬盘来保证持久化。
1 snapshotting(快照)–默认方式
RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。是默认的持久化方式。这种方式
是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。这种持久化方式被称
为快照snapshotting(快照)。
#过了900秒并且有1个key发生了改变就会触发save动作
#过了300秒并且有10个key发生了改变就会触发save动作
#过了60秒并且至少有10000个key发生了改变也会触发save动作
结论:在redis.conf文件中dir ./定义了数据库文件的存放位置,默认是当前目录。所以每次重启redis 服务所在的位置不同,将会生成新的dump.rdb文件;建议服务器搭建完成时先修改快照文件保存位置。
2 append-only file(缩写aof)
使用AOF 会让你的Redis更加耐久: 你可以使用不同的持久化策略:每次写的时候备份、每秒备
份、无备份。使用默认的每秒备份策略,Redis的性能依然很好(备份是由后台线程进行处理的,主线程会
尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据。
打开redis.conf配置文件开启AOF持久化
appendonly no
#默认不使用AOF持久化(450行)将no改成yes。
# appendfsync always
#有写操作,就马上写入磁盘。效率最慢,但是最安全
appendfsync everysec
#默认,每秒钟写入磁盘一次。
# appendfsync no
#不进行AOF备份,将数据交给操作系统处理。最快,最不安全
3 测试
重启redis服务,登录client添加一个键值,退出然后ls命令查看下是否生成appendonly.aof。
进入文件或用cat查看