NoSql
MySQL,SQL Server 等这些数据库为关系型数据库,传统项目往往使用这种纯数据库就完全可以满足需求了,随着移动互联网的发展,普通的关系型数据库就不适合把超大量的数据提供出去作并发型的查询,因为数据库的单表性能是有限的,如果该表做的优化好,那么它数据量可达到六七百万,一般来说,可能就只有四五百万。在单表的数据量去到三百万左右的时候,就需要考虑后续海量数据优化了,而使用 NoSql 就是优化方案之一。
NoSql 全称是 Not Only SQL
,它不仅仅可以存储数据,还可以缓存数据,可以横向扩展、方便、高效。
NoSql 的常见分类:
- 键值对数据库:Redis、Memcache
- 列存储数据库:Hbase、Cassandra
- 文档型数据库:MongoDB、CouchDB
- 图形数据库:Neo4J,FlockDB
而 Redis 的优点:
- 丰富的数据结构,即可以存储多种数据类型(Memcache 只能存储字符串类型)
- 持久化(Memcache 无法持久化)
- 主从同步,故障转移,即实现集群
- 内存数据库,查询效率高
1 Redis 的安装
到 官网 下载压缩包,我这边下载 5.0.5
版本,下载后传入Linux解压,进入解压文件,输入 make
命令进行编译,然后输入以下命令安装 redis 到 /usr/local/redis
目录:
make install /usr/local/redis
把解压文件中的核心配置文件 redis.conf
复制到 /usr/local/redis/bin
目录下,并作以下修改:
- 将
daemonize
改成yes
,目的是让 redis 在后台运行
# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize yes
- 修改 redis RDB持久化存放临时备份文件的目录,这里改成
/usr/local/redis/workspaces
,注:目录要手动新建
# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir /usr/local/redis/workspaces
- 修改 ip 为
0.0.0.0
,代表可以让远程连接,不受 ip 限制
bind 0.0.0.0
- 修改连接密码,这里设置为
123456
requirepass 123456
把解压文件中的 utils/redis_init_script
复制到 /etc/init.d
目录下,目的是为了设置 redis 开机自启动,并作以下修改:
- 头部添加以下内容设置开机自启动:
#chkconfig: 22345 10 90
#description: Start and Stop redis
添加后执行以下命令,正式让 Redis 开机自启动:
chkconfig redis_init_script on
- 修改文件目录指向:
REDISPORT=6379
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/usr/local/redis/bin/redis.conf"
同时由于在核心配置文件中添加了连接密码,所以在脚本中关闭 Redis 逻辑还需要把该密码填入进去:
$CLIEXEC -a "123456" -p $REDISPORT shutdown
最后在 /etc/init.d
目录下使用 ./redis start
启动 Redis,使用 ./redis stop
关闭 Redis。
2 Redis命令行客户端基本使用
在上述安装步骤里没有指定安装目录,Redis 会安装到 /usr/local/bin
中,此时任意地方输入 redis-cli
即可打开 Redis 命令行客户端,如果指定了安装目录,则需要添加环境变量,如输入命令 PATH="${PATH}:/usr/local/redis/bin"
(这样子添加,重启之后就会失效,想要长久设置就需要修改 etc/profile
文件,在结尾加上 PATH=${PATH}:/usr/local/redis/bin
)即可。
检查 Redis 服务端是否正常运行,可以输入以下命令:
redis-cli -a 123456 ping
其中 -a 123456
是上述安装时候修改核心配置文件时设置的密码,当 Redis 正常运行时,就会返回 PONG
。
输入 redis-cli
进入到命令客户端后,还需要输入密码 -auth 123456
获得授权后方可进行后续操作。
可以下载
RedisDesktopManager
这个 redis 的图形客户端,但记得远程连接的时候,Linux 系统要开启对应的端口
3 Redis 的命令参考和数据类型
keys *
:查看所有的 key ,不建议在生产使用,有性能影响type key
:查看 key 类型,如:type name
- Redis 的数据库有 16 个,可以在核心配置文件中设置,使用
select index
命令可以切换数据库,切换之后命令行光标会有当前的数据库索引 flushdb
:删除当前数据库下所有的数据flushall
:删除所有数据库中的数据
3.1 字符串类型
get/set/del
:查询、设置、删除键值,如set name seiei
set key value ex time
:设置键值附带过期时间,如set name seiei ex 10
expire key time
:设置某键值的过期时间,如expire name 10
ttl key
:time to leave
的缩写,查看某键值的过期时间,-1
表示永不过期,-2
表示已经过期setnx key value
:SET if Not eXists
的缩写,设置已经存在的 key 时,不会覆盖,如set name taka
append key value
:合并字符串键值,如append name 123
,此时name
值为seiei123
strlen key
:获取字符串的长度,如strlen name
incrby key value
:累加给定值,如incrby age 10
,给定值可以为负数incrbyfloat key value
:累加给定值(float
类型)getrange key start end
:截取数值,end
为-1
时,表示截取到最后setrange key start newdata
:从start
位置开始替换数据,如setrange name 1 takaaaaaaa
,此时替换值字符串长度比原值要大,即此时获取到数值为stakaaaaaaa
mset [key value]
:连续设值,如mset name seiei age 18
mget [key]
:连续取值,如mget name age
msetnx
:连续设置,如果键值已存在则不设置,如msetnx name taka age 28
,注如果设置的键值中有一条已存在,则其余的键值也不会设置del key
:删除键值
3.2 hash 类型
hash 类型就如同 Java 中的 map
,不过它不能储存嵌套对象
hset key property value
:设置对象键值,如hset user name seiei
hmset key property value
:设置对象键值,如果已存在键值,则不提换hmset key [property value]
:设置对象中的多个键值对hget key property
:获取对象某个键名对应的数值hmget key [property]
:获取对象多个键名对应的数值hgetall key
:获取这个对象的内容hlen key
:查看该对象有多少个属性hkeys key
:获取该对象的所有属性名hvals key
:获取该对象的所有属性值hexists key property
:查看该对象是否存在某个属性hdel key property
:删除对象的某个属性del key
:删除对象
3.3 list 类型
lpush key [member..]
:构建一个 list 类型数据,从左边开始添加数据,即每个添加的数值都是从索引为0
那条数据向左插入,如lpush user seiei taka
获得的列表为[taka, seiei]
rpush key [member..]
:构建一个 list 类型数据,从右边开始添加数据,如rpush user seiei taka
获得的列表为[seiei, taka]
,所以正常情况下应该使用rpush
更适合理解lrange key start end
:获取数据,start
表示开始索引,end
表示结束索引(-1
表示获取到列表最后)llen key
:获取列表长度lpop key
:从列表左侧剔除一个数据rpop key
:从列表右侧剔除一个数据lindex key index
:根据索引获取列表中对应的数值,如lindex listOfNum 0
lset list index value
:根据索引替换列表对应的数值,如lset listOfNum 0 seiei
linsert list before/after pivot value
:插入新的数值,注意pivot
这里是存在于列表中的数值,而不是索引,如linsert listOfNum before seiei taka
lrem key count value
:删除数据,其中count
表示删除的个数,如lrem listOfNum 1 seiei
ltrim list start end
:截取数值并替换原来的列表,如ltrim listOfNum 1 2
3.4 set 类型
sadd key [member..]
:构建一个 set 类型数据,添加数据,如sadd setOfNum 1 2 3 4
smembers key
:获取 set 的数据,如smembers setOfNum
scard key
:获取 set 的长度sismember key member
:判断某个数值是否存在于 set 中srem key [member..]
:删除数值spop key count
:随机删除count
个数值srandmember key count
:随机获取count
个数值,如srandmember setOfNum 3
smove source destination member
:将源 set 中的某个数值移动到目标 set 中,如果源 set 和 目标 set 都有该移动的数值,则从源 set 中删除该数值,如smove setOfNum setOfNum2 99
sdiff key1 key2
:获取差集,将key1
有而key2
没有的元素列出来sinter key1 key2
:获取交集sunion
:获去并集
3.5 zset 类型
zset 类型可以理解为排序的 set 类型,其包含的每个元素都有对应一个分数值 score
,根据这个 score
值进行排序(score
数值可以相同)。
zadd key [score value..]
:构建一个 zset 类型数据,添加数据,如zadd setOfNum 10 1 20 2
zrange key start end
:获取 zset 内容,start
为开始索引,end
为结束索引zrange key start end withscores
:同上,不过附带score
数值zrangebyscore key minScore maxScore
:根据score
的数值范围获取 zset 内容,如zrangebyscore zsetOfNum 10 30
zrank key value
:获取对应数值的索引zscore key value
:获取对应数值的score
值zcard key
:统计 zset 的个数zcount key minScore maxScore
:统计score
数值在minScore
到maxScore
之间的个数,如zcount zsetOfNum 10 10
表示获取score
数值为10
的元素个数(包括10
),zcount zsetOfNum (10 (20
表示获取score
数值范围在10
和20
之间的元素个数(不包括10
和20
)zrem key value
:删除对应的数值