NoSQL(Not Only SQL),泛指非关系型数据库,是为了处理高并发读写、海量数据的高效率存储和访问、高扩展性和高可用性而产生的。
分类 | 相关产品 | 典型应用 | 数据模型 | 优点 | 缺点 |
---|---|---|---|---|---|
键值对(Key-Value)存储 | Redis、Voldemort、Berkeley DB | 内容缓存、处理高访问负载 | 一系列键值对 | 快速查询 | 存储的数据缺少结构化 |
列存储数据库 | Cassandra、HBase、Riak | 分布式文件系统 | 以列簇式存储,将同一列数据存在一起 | 查询速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档型数据库 | MongoDB、CouchDB | Web应用 | 一系列键值对 | 数据结构要求不严格 | 查询性能不高,缺乏统一的查询语法 |
图形数据库 | Neo4j、InfoGrid | 社交网络,推荐系统,专注于构建关系图谱 | 图结构 | 利用图结构相关算法 | 需要对整个图做计算才能得出结果,不容易做分布式的集群方案 |
本篇将主要阐述如何使用 Redis(https://github.com/antirez/redis)数据库进行内容缓存和高访问负载,redis 使用 C 语言开发的一个开源的高性能的键值对数据库,通过提供多种键值数据类型来适应不同场景下的存储需求,目前 Redis 支持的键值数据类型有很多种,比如字符串类型、列表类型、有序集合类型、散列类型、集合类型。Redis 官方也给我们提供了一些测试数据,有 50 个并发程序来执行 10 万次请求,Redis 读的速度达到了 11 万次/秒,写的速度达到了 8.1 万次/秒。
Redis 最广泛的应用场景就是使用它作为缓存(新闻或商品内容、聊天式的在线好友列表),除此还有任务队列(秒杀、抢购)、网站访问统计、数据过期处理(可以精确到毫秒)、应用排行榜、分布式集群架构中的 session 分离等。
1.Linux下安装Redis数据库
1
2
3
4
5
6
7
8
9
10
11
|
$ scp ~ /Downloads/redis-4 .0.1. tar .gz root@192.168.2.10: /usr/local // 上传安装包
$ ssh root@192.168.2.10 //SSH 连接
# yum -y install gcc gcc-c++ autoconf automake //gcc、gcc-c++的库文件
# cd /usr/local
# tar -zxvf redis-4.0.1.tar.gz //解压缩
# cd redis-4.0.1 //切换到该目录下
# make //编译,将.c文件编译为.o文件
# make PREFIX=/usr/local/redis install //指定路径安装
# cd /usr/local
# ls //如果存在redis文件夹,则安装成功
|
其中 /usr/local/redis/bin/ 下包含:
1
2
3
4
5
6
7
|
redis-benchmark //性能测试的一个工具
redis-check-aof //aof文件修复的一个工具 redis-check-aof --fix appendonlly.aof
redis-check-dump //rdb文件检查的一个工具,rdb文件为Redis默认数据库文件
redis-check-rdb //rdb文件修复的一个工具 redis-check-rdb --fix dump.rdb
redis-cli //命令行的一个客户端
redis-sentinel -> redis-server
redis-server //redis服务器启动的命令
|
接下来继续我们的命令:
1
2
3
4
|
# cd redis-4.0.1
# cp redis.conf /usr/local/redis
# cd /usr/local/redis
# vim redis.conf //编辑Redis的配置文件
|
具体配置步骤:
1)绑定你的授权ip地址:修改69行的 bind 127.0.0.1 为 bind [host](绑定到所有网络: 注释掉69行的 bind 127.0.0.1)
2)关闭保护模式:将88行的 protected-mode yes 修改为 daemonize no
3)配置后台启动:将136行的 daemonize no 修改为 daemonize yes
4)配置 Redis 持久化: RDB方式(默认支持,不需要配置)和AOF方式(将509行的appendonly no 修改为 appendonly yes,538-540为同步策略的设置,开启 appendfsync always,注释 appendfsync everysec,always为没修改一次就同步,everysec为每一秒同步,no为不同步,为了安全此处选择 always)。
编辑完成后退出 vim,之后还需要开放 Redis 的 6379 端口:
1
2
3
4
5
6
|
# vim /etc/sysconfig/iptables //打开Linux防火墙的设置
// 增加代码 -A INPUT -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT
// 退出 vim,执行防火墙重启命令
# service iptables restart
# ./bin/redis-server ./redis.conf //启动redis服务器,可以通过 ps -ef | grep -i redis 查看启动是否成功
|
还有一些其他 Redis 命令如下:
1
2
|
# ./bin/redis-cli shutdown //停止redis服务器
# ./bin/redis-cli //打开redis命令行客户端
|
2.Redis的数据结构
需要知道的是,Redis 的 Key 设置不要过长也不要过短,要有统一的命名规范。先看一下 keys 的操作:
1
2
3
4
5
6
7
8
9
10
11
|
$ ssh root@192.168.2.10 //SSH 连接
# /usr/local/redis/bin/redis-cli
> keys * // 显示所有的key
> keys my? // 显示以my开头的所有key
> del my1 my2 my3 // 删除my1、my2、my3
> exists my1 // 检查是否存在,存在返回1,不存在返回0
> get my1 // 获取key的value值
> rename my1 my2 // 重命名my1为my2
> expire my1 1000 // 设置key过期时间,单位秒
> ttl my1 // 剩余超时时间,没有设置则返回-1
> type my1 // 获取key对应value的类型
|
1.存储字符串 String
二进制是安全的,存入和获取的数据相同;Value 最多可以容纳的数据长度是 521 M。存储 String 常用的命令:
1
2
3
4
5
6
7
8
9
|
> set name zhangsan //赋值 set [ key ][value]
> get name //取值 get [ key ]
> getset name lisi //取值并赋值
> del name //删除 del [ key ]
> incr num //数值递增1,如果没有就默认创建0并递增1 incr [ key ]
> decr num //数值递减1,如果没有就默认创建0并递减1
> incrby num2 5 //数值递增指定值,如果没有就默认创建0 incrby [ key ][指定值]
> decrby num2 5 //数值递减指定值,如果没有就默认创建0 decrby [ key ][指定值]
> append num3 5 //插入指定内容,如果有则追加内容,如果没有则新创建 append [ key ][插入值]
|
2.存储哈希 Hash
存储 Hash 可以看成是 String Key 和 String Value 的 Map 容器,适合存储 值-对象 的信息,例如用户名、密码、年龄等等,每一个 Hash 可以存储 4294967295 个键值对。存储 Hash 常用的命令:
1
2
3
4
5
6
7
8
9
10
11
12
|
> hset myhash username tom //赋值单个属性 hset [ key ][Hash键值对]
> hmset myhash username tom2 rose age 20 //赋值多个属性 hmset [ key ][Hash键值对1] rose [Hash键值对2]
> hget myhash username //获取单个属性 hget [ key ][key2]
> hmget myhash username age //获取多个属性 hget [ key ][key2][key3]
> hgetall myhash //获取全部值
> hdel myhash username age //删除多个属性
> del myhash //删除整个集合
> hincrby myhash age 5 //增加属性值
> hexists myhash username //判断某个属性中的 key 是否存在,存在返回1,不存在返回0
> hlen myhash //获取属性个数 hlen [key1]
> hkeys myhash //获取所有属性名称 hkeys [key1]
|
3.存储字符串列表 List
在 Redis 中,List(ArrayList 使用数组方式,LinkedList 使用双向链表方式)顺序是按照插入顺序排序的一个字符串链表,和数据结构中的普通链表是一样的,可以在它的头部和尾部添加新的元素,在插入的时候,如果该 key 不存在,那么 Redis 就会为这个键创建一个新的链表,相反,如果链表中所有元素都被移除了,那么该键也会被从数据库中删除。存储 List 常用的命令:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
> lpush mylist a b c //从双向链表的头部开始添加,如果mylist不存在则创建 lpush [ key ][value1][value2]..
> lpushx mylist d //从双向链表的头部开始添加,如果mylist不存在则不插入
> rpush mylist 1 2 3 //从双向链表的尾部开始添加
> lrange mylist 0 5 //查看链表 lrange [ key ][开始位置][结束位置]
> lpop mylist //弹出双向链表的头部元素,弹出后,双向链表中就没有这个元素了
> rpop mylist //弹出双向链表的尾部元素
> rpoplpush mylist1 mylist2 //将mylist1里面头部元素弹出插入mylist2头部
> llen mylist //获取元素个数 llen [ key ]
> lrem mylist 1 2 //从头到尾删除1个2 lrem [ key ][删除的个数][删除的元素]
> lrem mylist -1 2 //从尾到头删除1个2
> lrem mylist 0 2 //从尾到头删除所有2
> lset mylist 3 k //第三个value值设置为k
> linsert mylist before b 11 //第一个b之前插入11
> linsert mylist after b 22 //第一个b之后插入22
|
rpoplpush 命令在消息发布系统中的使用场景:
4.存储字符串集合 Set
和 List 类型不同的是,Set 集合中不允许出现重复的元素,无序的,Set 可以包含的最大元素数量是 4294967295。存储 Set 常用的命令:
1
2
3
4
5
6
7
8
9
10
11
12
|
> sadd myset a b c //向 Set 中添加了三个值 sadd [ key ][ Set 集合值]
> srem myset a b //删除指定元素
> smembers myset //查看 Set 中元素 smembers [ key ]
> sismember myset c //判断 Set 中是否存在c,存在返回1,不存在返回0
> sdiff myset myset2 //返回两个 Set 集合的差集运算
> sdiffstore my my1 my2 //将两个 Set 集合的差集存储到另一个集合(my)中
> sinter myset myset2 //返回两个 Set 集合的交集运算
> sunion myset myset2 //返回两个 Set 集合的并集运算
> scard myset //返回 Set 集合成员数量
> srandmember myset //随机返回 Set 中一个成员
|
5.存储有序字符串集合 SortedSet
SortedSet 中的成员在集合中的位置是有序的。存储 SortedSet 常用的命令:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
> zadd mysort 65 aa 85 bb 95 cc //有序添加元素 zadd [ key ][姓名 分数][姓名 分数]...
> zscore mysort aa //获得分数
> zcard mysort //返回集合成员数量
> zrem mysort tom cc //删除元素
> zrange mysort 0 -1 //范围查询,-1表示最后,显示姓名
> zrange mysort 0 -1 withscores //范围查询,姓名分数都会显示
> zrevrange mysort 0 -1 withscores //范围查询,由大到小排序显示
> zremrangebyrank mysort 0 2 //按照排序的范围进行删除,0~2位置
> zremrangebyscore mysort 70 90 //按照分数进行删除,70~90
> zrangebyscore mysort 0 90 //按照分数查0~90之间的
> zrangebyscore mysort 0 90 withscores limit 0 2 //按照分数查0~90之间的,由大到小排序,只显示前2个
> zcount mysort 60 100 //获取60~100之间的个数
|
SortedSet 可以应用于游戏的积分排行榜、构建索引数据。
3.Redis的多数据库和事务
一个 Redis 实例最多可以提供16个数据库(0-15),默认连接第 0 号数据库,也可以通过select 选择数据库:
1
2
|
> select 1 //选择1号数据库
> move myset 2 //移动myset到2号数据库
|
支持事务(所有命令都将串行化执行)的操作:
1
2
3
|
> multi //开启事务
> exec //提交事务
> discard //回滚事务
|
4.使用Jedis操作Redis数据库
Jedis(https://github.com/xetorthio/jedis)是 Redis 官方首选的 Java 客户端开发包,
需要添加 Maven 依赖:
1
2
3
4
5
6
7
8
|
<!-- jedis -->
< dependency >
< groupId >redis.clients</ groupId >
< artifactId >jedis</ artifactId >
< version >2.9.0</ version >
< type >jar</ type >
< scope >compile</ scope >
</ dependency >
|
普通方式操作 Redis:
1
2
3
4
5
6
7
8
9
10
11
|
Jedis jedis = null ;
try {
jedis = new Jedis( "123.57.73.52" , 6379 );
jedis.set( "name" , "zhangsan" ); //保存数据
String value = jedis.get( "name" ); //获取数据
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
} finally {
jedis.close(); //释放资源
}
|
使用 Jedis 连接池操作 Redis:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//获得连接池的配置对象
JedisPoolConfig config = new JedisPoolConfig();
//设置最大连接数, 默认8个
config.setMaxTotal( 8 );
//设置最大空闲连接数, 默认8个
config.setMaxIdle( 8 );
//获得连接池
JedisPool jedisPool = new JedisPool(config, "123.57.73.52" , 6379 );
//获得核心对象
Jedis jedis = null ;
try {
jedis = jedisPool.getResource();
jedis.set( "name2" , "lisi" ); //保存数据
String value = jedis.get( "name2" ); //获取数据
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
} finally {
jedis.close(); //释放资源
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/smartbetter/article/details/77568440