NoSQL 简介
NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。
在现代的计算系统上每天网络上都会产生庞大的数据量。
这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理。 1970年 E.F.Codd’s提出的关系模型的论文 “A relational model of data for large shared data banks”,这使得数据建模和应用程序编程更加简单。
通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用的主导技术。
NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
常见的NoSql产品
2、Redis的介绍和安装
(1)介绍
速度很慢,几乎进去不去啊。
中文网站:http://www.redis.cn/
有部分翻译的官方文档,英文差的同学的福音
Redis 简介
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,
同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及
Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,
意思就是要么成功执行要么失败完全不执行。
单个操作是原子性的。多个操作也支持事务,即原子性,
通过MULTI和EXEC指令包起来。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,
这是一个不同于其他数据库的进化路径。
Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,
所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。
在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,
在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。
同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
(2)安装Redis
1)将Redis上传到虚拟机当中并解压
将目录路径切换到压缩包放的位置
tar zxvf redis-4.0.9.tar.gz
切换到解压后的Redis目录当中
cd redis-4.0.9
执行安装命令
make & make install
修改配置文件
vim redis.conf
将这个注释掉(注意有两个这个上面的默认已经注释掉了,下面这个需要手动注释,如果不注释就只能本地访问)
保护模式设置关闭
保存退出
开启端口号
iptables -A INPUT -ptcp --dport 6379 -j ACCEPT
service iptables save
2)启动redis
redis-server redis.conf
启动成功
终止运行
Ctrl+C
使用后台启动
修改配置文件
vim redis.conf
保存退出
再次启动
redis-server redis.conf
启动成功
3)链接Redis
redis-cli
链接成功
输入
ping
返回
3、设置开机启动
(1)先修改redis的安装目录的名称
停止redis
killall redis-server
修改redis的安装目录名称
mv redis-4.0.9 redis
(2)输入命令,新建文件
vim /etc/init.d/redis
输入下面内容:
#!/bin/sh
chkconfig: 2345 90 10
description: Redis is a persistent key-value database
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
REDISPORT=6379
EXEC=/usr/local/bin/redis-server
REDIS_CLI=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis.pid
CONF=“/usr/local/leyou/redis/redis.conf”
case “$1” in
start)
if [ -f $PIDFILE ]
then
echo “$PIDFILE exists, process is already running or crashed”
else
echo “Starting Redis server…”
$EXEC $CONF
fi
if [ “$?”=“0” ]
then
echo “Redis is running…”
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo “$PIDFILE does not exist, process is not running”
else
PID=$(cat $PIDFILE)
echo “Stopping …”
$REDIS_CLI -p $REDISPORT SHUTDOWN
while [ -x ${PIDFILE} ]
do
echo “Waiting for Redis to shutdown …”
sleep 1
done
echo “Redis stopped”
fi
;;
restart|force-reload)
${0} stop
${0} start
;;
*)
echo “Usage: /etc/init.d/redis {start|stop|restart|force-reload}” >&2
exit 1
esac
然后保存退出
注意:以下信息需要根据安装目录进行调整:
EXEC=/usr/local/bin/redis-server # 执行脚本的地址
REDIS_CLI=/usr/local/bin/redis-cli # 客户端执行脚本的地址
PIDFILE=/var/run/redis.pid # 进程id文件地址
CONF=“/usr/local/src/redis-3.0.2/redis.conf” #配置文件地址
(3)设置权限
chmod 755 /etc/init.d/redis
(4)启动测试
/etc/init.d/redis start
启动成功会提示如下信息:
Starting Redis server…
Redis is running…
(5)设置开机自启动
chkconfig --add /etc/init.d/redis
chkconfig redis on
(6)重新启动redis
redis-server redis.conf
1、通过help命令
可以让我们查看到Redis的指令帮助信息∶
在 help后面跟上空格,然后按tab键,会看到Redis对命令分组的组名:
主要包含:
-
@generic:通用指令
-
@string:字符串类型指令
-
@list:队列结构指令
-
@set: set结构指令
-
@sorted_set:可排序的set结构指令
-
@hash: hash结构指令
其中除了 @generic以为的,对应了Redis中常用的5种数据类型:
-
String:等同于java中的,
Map<String,String>
-
list:等同于java中的
Map<String,List<String>>
-
set:等同于java中的
Map<String,Set<String>>
-
sort_set:可排序的set
-
hash:等同于java中的:
Map<String,Map<String,String>>
可见,Redis中存储数据结构都是类似java的map类型。
Redis不同数据类型,只是 'map’的值的类型不同。
2、通用指令
(1)keys
获取符合规则的键名列表。
- 语法:keys pattern
示例: keys *
(查询所有的键)
127.0.0.1:6379> set name jack
OK
127.0.0.1:6379> set age 123
OK
127.0.0.1:6379> keys *
-
“age”
-
“name”
127.0.0.1:6379>
生产环境当中一定要禁用keys *
(2)exists
判断一个键是否存在,如果存在返回整数1,
-
语法:
EXISTS key
-
示例:
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists hhh
(integer) 0
127.0.0.1:6379> exists hhh
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> exists gae
(integer) 0
127.0.0.1:6379> exists age
(integer) 1
127.0.0.1:6379>
(3)del
DEL:删除key,可以删除—个或多个key
-
语法:DEL key [key …]
-
示例:
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> del hhh
(integer) 0
127.0.0.1:6379> exists name
(integer) 0
(4)select(切换库)
切换到别的库就看不到刚刚 创建的key和value
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> keys *
(empty list or set)
redis默认有16个库(0-15)默认就是在0号库
(5)expire
语法:
-
EXPIRE key seconds
-
作用:设置key的过期时间,超过时间后,清除(默认是永远不会清除)
-
返回值:
-
- 如果成功设置过期时间,返回1。
-
- 如果key不存在或者不能设置过期时间,返回0
(7)TTL
TTL:查看一个key的过期时间·语法:TTL key
-
返回值:
-
返回剩余的过期时间
-
- -1二列永不过期
-
- -2:已过期或不存在·示例:
127.0.0.1:6379> set name jack
OK
127.0.0.1:6379> EXPIRE name 10
(integer) 1
127.0.0.1:6379> TTL name
(integer) 6
127.0.0.1:6379> TTL name
(integer) 2
127.0.0.1:6379> TTL name
(integer) 1
127.0.0.1:6379> TTL name
(integer) 0
127.0.0.1:6379> TTL name
(integer) -2
127.0.0.1:6379>
-2代表死亡
(8)persist
- 语法
persister key
- 作用
移除给定key的生存时间,将这个key 从带生存时间 key转换成一个不带生存时间、永不过期的key .
3、字符串指令
字符串结构,其实是Redis中最基础的K-V结构其键和值都是字符串。
类似Java的Map<String,String>
字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。可以存储JSON化的对象、字节数组等。一个字符串类型键允许存储的数据最大容量是512MB。
下表列出了常用的 redis 字符串命令:
| 序号 | 命令及描述 |
| — | — |
| 1 | SET key value
设置指定 key 的值 |
| 2 | GET key
获取指定 key 的值。 |
| 3 | GETRANGE key start end
返回 key 中字符串值的子字符 |
| 4 | GETSET key value
将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 |
| 5 | GETBIT key offset
对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 |
| 6 | MGET key1 [key2…]
获取所有(一个或多个)给定 key 的值。 |
| 7 | SETBIT key offset value
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 |
| 8 | SETEX key seconds value
将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。 |
| 9 | SETNX key value
只有在 key 不存在时设置 key 的值。 |
| 10 | SETRANGE key offset value
用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。 |
| 11 | STRLEN key
返回 key 所储存的字符串值的长度。 |
| 12 | MSET key value [key value …]
同时设置一个或多个 key-value 对。 |
| 13 | MSETNX key value [key value …]
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。 |
| 14 | PSETEX key milliseconds value
这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。 |
| 15 | INCR key
将 key 中储存的数字值增一。 |
| 16 | INCRBY key increment
将 key 所储存的值加上给定的增量值(increment) 。 |
| 17 | INCRBYFLOAT key increment
将 key 所储存的值加上给定的浮点增量值(increment) 。 |
| 18 | DECR key
将 key 中储存的数字值减一。 |
| 19 | DECRBY key decrement
key 所储存的值减去给定的减量值(decrement) 。 |
| 20 | APPEND key value
如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。 |
基本的存取命令
自增长
自减
批量增
批量获取
4、字符串指令
Redis的Hash结构类似于Java中的Map<String,Map<String,String>>
,
键是字符串,值是另一个映射。
结构如图:
这里我们称键为key,字段名为hKey,字段值为hValue
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
127.0.0.1:6379> HMSET runoobkey name “redis tutorial” description “redis basic commands for caching” likes 20 visitors 23000
OK
127.0.0.1:6379> HGETALL runoobkey
-
“name”
-
“redis tutorial”
-
“description”
-
“redis basic commands for caching”
-
“likes”
-
“20”
-
“visitors”
-
“23000”
在以上实例中,我们设置了 redis 的一些描述信息(name, description, likes, visitors) 到哈希表的 runoobkey 中。
下表列出了 redis hash 基本的相关命令:
| 序号 | 命令及描述 |
| — | — |
| 1 | HDEL key field1 [field2]
删除一个或多个哈希表字段 |
| 2 | HEXISTS key field
查看哈希表 key 中,指定的字段是否存在。 |
| 3 | HGET key field
获取存储在哈希表中指定字段的值。 |
| 4 | HGETALL key
获取在哈希表中指定 key 的所有字段和值 |
| 5 | HINCRBY key field increment
为哈希表 key 中的指定字段的整数值加上增量 increment 。 |
| 6 | HINCRBYFLOAT key field increment
为哈希表 key 中的指定字段的浮点数值加上增量 increment 。 |
| 7 | HKEYS key
获取所有哈希表中的字段 |
| 8 | HLEN key
获取哈希表中字段的数量 |
| 9 | HMGET key field1 [field2]
获取所有给定字段的值 |
| 10 | HMSET key field1 value1 [field2 value2 ]
同时将多个 field-value (域-值)对设置到哈希表 key 中。 |
| 11 | HSET key field value
将哈希表 key 中的字段 field 的值设为 value 。 |
| 12 | HSETNX key field value
只有在字段 field 不存在时,设置哈希表字段的值。 |
| 13 | HVALS key
获取哈希表中所有值。 |
| 14 | HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的键值对。 |
(1)HSET和HGET以及HGETALL
127.0.0.1:6379> hset user:123 name “Rost”
(integer) 1
127.0.0.1:6379> hset user:123 age 21
(integer) 1
127.0.0.1:6379> hget user:123 name
“Rost”