NoSQL 概述

  • 什么是 NoSQL
    • NoSQL=Not Only SQL
    • 非关系型数据库
  • 为什么需要 NoSQL
    • 高并发读写
    • 海量数据的高校存储和访问
    • 高可扩展性和高可用性
  • NoSQL 数据库的四大分类
    • 键值(Key-Value)存储(redis)
    • 列存储(hbase)
    • 文档数据库(mongodb)
    • 图形数据库
  • NoSQL 特点
    • 易扩展(数据之间没有关系)
    • 灵活的数据模型
    • 大数据量,高性能
    • 高可用

Redis 概述

  • 高性能键值对数据库,支持的键值数据类型
    • 字符串类型
    • 列表类型
    • 有序集合类型
    • 散列类型
    • 集合类型
  • Redis 的应用场景
    • 缓存
    • 任务队列(秒杀、抢购)
    • 应用排行榜
    • 网站访问统计
    • 数据过期处理
    • 分布式集群架构中的 session 分离
  • Redis 安装
    • 搭建环境
      • 虚拟机:VMware
      • Linux 系统:CentOS
      • SSH 客户端:CRT
    • 安装
1
2
3
4
5
6
7
8
9
10
11
12
yum install gcc-c++ 安装gcc编译环境
wget http://download.redis.io/releases/redis-4.0.14.tar.gz 下载redis安装包
tar xzf redis-4.0.14.tar.gz 解压
cd redis-4.0.14 进到redis目录
make 编译
make PREFIX=/usr/local/redis install 设置安装目录安装
cp redis.conf /usr/local/redis
修改redis.conf--yes开启后端启动
./bin/redis-server ./redis.conf 启动redis
./bin/redis shutdown 停止redis
./bin/redis-cli 连接redis客户端
set get del keys查看当前所有key

Jedis

  • jedis 是 redis 官方首选的 java 客户端开发包

Redis 存储数据结构

  • 存储 String
1
2
3
4
5
6
7
8
9
set company imooc
get company
getset company baidu 先获取再赋值
del company 删除
incr num 递增1,如果num不存在,会先初始num为0再加1
decr num 递减1
incrby num 3 加3
decrby num 3 减3
append num 5 追加5
  • 存储 hash
1
2
3
4
5
6
7
8
9
10
11
12
13
String key 和 String value 的 map 容器
hset myhash username jack
hmset myhash username jack age 18 设置多个值
hget myhash
hmget myhash username age 获取多个值
hgetall myhash 获取全部属性和值
hdel myhash username age 删除
del myhash 删除整个集合
hincrby myhash age 5 给hash里的age加5
hexists username 判断hash中的值是否存在
hlen 获取长度
hkeys myhash 获取所有key
hvals myhash 获取所有值
  • 存储 list
    • ArrayList 使用数组方式
    • LinkedList 使用双向链接方式
    • 双向链表中增加数据
    • 双向链表中删除数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
lpush mylist a b c 添加元素到链表中
lrange mylist 0 5 查看索引0-5的元素
lrange mylist 0 -1 从0到倒数第一个元素
lpop mylist 头弹出
rpop mylist 尾弹出
llen mulist 获取长度
lpushx mylist x 头插入x
rpushx mylist x 尾插入x
lrem mylist 2 3 从头到尾删除2个3
lrem mylist -2 1 从尾到头删2个1
lrem mylist 0 2 删除所有2
lset mylist 3 m 在索引3的位置插入m
linsert mylist before b 1 在从头开始第一个b前插入1
linsert mylist after b 2 在从头开始第一个b后插入2
rpoplpush mylist1 mylist2 把mylist1的右边元素弹出压入到mylist2的最左边

image.png

  • 存储 set
    • 添加/删除元素
    • 获得集合中元素
    • 集合中差集运算
    • 集合中交集运算
    • 集合中并集运算
    • 扩展命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sadd myset a b c 添加set
srem myset a 删除a
smembers myset 查看myset所有值
sismember myset a 判断a是否存在
sadd mya1 a b c
sadd mya2 a c 1 2
sdiff mya1 mya2 差集运算
sinter mya1 mya2 交集运算
sunion mya1 mya2 并集运算
scard myset 获取数量
srandmember myset 随机获取一个值
sdiffstore my1 mya1 mya2 将差集存到my1上
sinterstore my2 mya1 mya2 将交集存到my2上
sunionstore my3 mya1 mya2 将并集存到my3上
  • 存储 Sorted-Set
    • Sorted-Set 集合中的成员是有序的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
zadd mysort 70 zs 80 ls 90 ww 添加,返回添加元素个数
zadd mysort 100 zs 将已有zs的分数替换掉
zscore mysort zs 查看zs的分数
zcard mysort 查看mysort元素个数
zrem mysort ww 删除元素
zrange mysort 0 -1 从第一个到最后一个元素
zrange mysort 0 -1 withscores 带分数查询
zrevrange mysort 0 -1 withscores 反转查询
zremrangebyrank mysort 0 4 按照等级范围删除
zremrangebyscore mysort 80 100 按照分数范围删除
zrangebyscore mysort 0 100 按照分数范围显示
zrangebyscore mysort 0 100 withscores 按照分数范围显示值,包括分数
zrangebyscore mysort 0 100 withscores limit 0 2 按照分数范围显示前两条
zincrby mysort 3 ls 给ls的分数加3
zcount mysort 80 90 查看80到90之间的个数

Keys 的通用操作

1
2
3
4
5
6
7
8
9
10
11
12
13
keys * 查看所有key
keys my? 查看my开头的key
del my1 my2 my3 删除指定key
exists my1 判断key是否存在
get company 获取key的值
rename company newcompany 重命名
expire newcompany 1000 设置过期时间为1000秒
ttl newcompany 查看剩余超时时间
type newcompany 查看类型
type mylist
type myset
type myhash
type mysort --zset

Redis 的特性

  • redis 默认提供 16 个数据库,默认连接 0 号,可选择
1
2
3
4
select 0 选择0号数据库
move myset 1 移动myset到1号数据库
keys *
type myset
  • redis 事务,串行化执行,事务执行期间,redis 不再为其他客户端提供服务,如果某一命令执行失败,后面的还会执行
1
2
3
multi 开启事务后面的命令都会推到命令队列中
exec 提交
discard 回滚

Redis 持久化

  • 因为 redis 的数据都存在内存中,为了保证重启后数据不会丢失,需要存储到硬盘上,称之为持久化
  • RDB 方式
    • 默认支持的,在指定时间间隔内,将内存中的数据及快照写入磁盘
  • AOF 方式
    • 以日志形式记录服务器所有操作,redis 重启后读取磁盘中文件初始化 redis,同步效率低
  • 无持久化
  • 同时使用 RDB 和 AOF