一.什么是Redis

数据库分为关系型数据库(sql)非关系型数据库(nosql)

  • 常见的关系型数据库:
    Oracle,Microsoft SQL Server,MySQL,PostgreSQL,DB2,Microsoft Access, SQLite,Teradata,MariaDB(MySQL 的一个分支),SAP
  • 常见的非关系型数据库:
    Redis、memcache、HBase、MongoDB

二.nosql使用场景

redis 关系型数据库中的Table redis是不是关系型数据库_数据类型

3. Redis 简介

  • Redis ( REmote DIctionary Server远程字典服务器) ,是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。
  • 免费开源,高性能分布式内存数据库,基于内存运行,支持NoSQL

3.1 redis特征

1.数据间没有必然的关联关系
2.内部采用单线程机制进行工作
3.高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s
4.支持持久化,可以进行数据灾难恢复
5.多数据类型支持

常用的五种数据类型

string(字符串)
hash(哈希)
list(列表)
set(集合)
zset(sorted set:有序集合)
其他数据类型:
bitmap(位图)
hyperloglogs (估算集合的基数)
(geospatial)

3.2数据类型详解

字符串string (key–value)

字符串类型是Redis中最为基础的数据存储类型,是一个由字节组成的序列,他在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据货Json对象描述信息等,是标准的key-value,一般来存字符串,整数和浮点数。Value最多可以容纳的数据长度为512MB
应用场景:很常见的场景用于统计网站访问数量,当前在线人数等。incr命令(++操作)

redis 关系型数据库中的Table redis是不是关系型数据库_数据类型_02

列表list (有序可重复)

Redis的列表允许用户从序列的两端推入或者弹出元素,列表由多个字符串值组成的有序可重复的序列,是双向链表结构,所以向列表两端添加元素的时间复杂度为0(1),获取越接近。

应用场景:

1.最新消息排行榜。2.消息队列,以完成多程序之间的消息交换。可以用push操作将任务存在list中(生产者),然后线程在用pop操作将任务取出进行执行。(消费者)两端的元素速度就越快。

redis 关系型数据库中的Table redis是不是关系型数据库_rdb_03

散列hash(value为键值对)

Redis中的散列可以看成具有String key和String value的map容器,可以将多个key-value存储到一个key中。每一个Hash可以存储4294967295个键值对。

应用场景:

例如存储、读取、修改用户属性(name,age,pwd等)

redis 关系型数据库中的Table redis是不是关系型数据库_rdb_04

集合set(无序不可重复)

Redis的集合是无序不可重复的,和列表一样,在执行插入和删除和判断是否存在某元素时,效率是很高的。
集合最大的优势在于可以进行交集并集差集操作
Set可包含的最大元素数量是4294967295。

应用场景:

1.利用交集求共同好友。2.利用唯一性,可以统计访问网站的所有独立IP。3.好友推荐的时候根据tag求交集,大于某个threshold(临界值的)就可以推荐。

redis 关系型数据库中的Table redis是不是关系型数据库_redis 关系型数据库中的Table_05

有序集合 zset/sorted set

和set很像,都是字符串的集合,都不允许重复的成员出现在一个set中。
他们之间差别在于有序集合中每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。尽管有序集合中的成员必须是唯一的,但是分数(score)却可以重复。

应用场景:可以用于一个大型在线游戏的积分排行榜,每当玩家的分数发生变化时,可以执行zadd更新玩家分数(score),此后在通过zrange获取几分top ten的用户信息。

redis 关系型数据库中的Table redis是不是关系型数据库_aof_06

bitmap(位图)

bitmap就是通过最小的单位bit来进行0或者1的设置,表示某个元素对应的值或者状态。一个bit的值,或者是0,或者是1;也就是说一个bit能存储的最多信息是2。

  • 位(bit):是计算机 内部数据储存的最小单位,11001100是一个八位二进制数。
  • 字节(byte):是计算机中数据处理的基本单位,习惯上用大写 B 来表示,1B(byte,字节)= 8bit

命令:

用于获取Redis中指定key对应的值中对应offset的bit

getbit key offset

用于修改指定key对应的值,中对应offset的bit

setbit key key offset value

获取位图指定范围中位值为1的个数,如果不指定start与end,则取所有

bitcount key [start end]

做多个BitMap的and(交集)、or(并集)、not(非)、xor(异或)操作并将结果保存在destKey中

bitop op destKey key1 [key2...]

计算位图指定范围第一个偏移量对应的的值等于targetBit的位置

  1. 找不到返回-1
  2. start与end没有设置,则取全部
  3. targetBit只能取0或者1
bitpos key tartgetBit [start end]

优点

1.基于最小的单位bit进行存储,所以非常省空间。
2.设置时候时间复杂度O(1)、读取时候时间复杂度O(n),操作是非常快的。
3.二进制数据的存储,进行相关计算的时候非常快。
4.方便扩容

限制

redis中bit映射被限制在512MB之内,所以最大是2^32位。建议每个key的位数都控制下,因为读取时候时间复杂度O(n),越大的串读的时间花销越多

hyperloglogs(估算集合的基数)

一个HyperLogLog是一个用于统计唯一性事物数量的概率性数据结构(专业的说这叫估算集合的基数)。通常统计总数需要消耗与数量成正比例的存储空间,为了避免重复统计一个项多次你需要把你已经统计过的项记录下来,然而存在一种算法,损耗一定的精确度来节省存储空间,用一种带有一定误差的估算方式,在redis的实现中,这种误差小于1%。这种算法的魔力在于,你不再需要使用和已存储元素的数目成比例的存储空间,取而代之只使用固定数目的内存,在最差的情况下也仅仅需要12Kb的内存!如果你的元素数目很少,消耗的内存会更少。

127.0.0.1:6379> pfadd codehole user1
(integer) 1
127.0.0.1:6379> pfcount codehole
(integer) 1
127.0.0.1:6379> pfadd codehole user2
(integer) 1
127.0.0.1:6379> pfcount codehole
(integer) 2
127.0.0.1:6379> pfadd codehole user3
(integer) 1
127.0.0.1:6379> pfcount codehole
(integer) 3
127.0.0.1:6379> pfadd codehole user4
(integer) 1
127.0.0.1:6379> pfcount codehole
(integer) 4
127.0.0.1:6379> pfadd codehole user5
(integer) 1
127.0.0.1:6379> pfcount codehole
(integer) 5
127.0.0.1:6379> pfadd codehole user6
(integer) 1
127.0.0.1:6379> pfcount codehole
(integer) 6
127.0.0.1:6379> pfadd codehole user7 user8 user9 user10
(integer) 1
127.0.0.1:6379> pfcount codehole
(integer) 10

3.3对key的通用操作,所有的数据类型都可以使用的

redis 关系型数据库中的Table redis是不是关系型数据库_redis 关系型数据库中的Table_07

4 Redis 持久化(RDB、AOF)

RDB (数据快照)

AOF (过程日志)

4.1 RDB(数据快照)

将当前数据状态保存,快照形式,存储数据结果,关注的是数据

4.1.1 RDB指令

4.1.1.1 save指令

该指令会阻塞当前 Redis 服务器,执行 save 指令期间,Redis 不能处理其他命令,直到 RDB 过程完成为止。
手动执行一次保存操作

save

save指令相关配置

设置本地数据库文件名,默认值为 dump.rdb,通常设置为dump-端口号.rdb

dbfilename filename

设置存储.rdb文件的路径,通常设置成存储空间较大的目录中,目录名称data

dir path

设置存储至本地数据库时是否压缩数据,默认yes,设置为no,节省 CPU 运行时间,但存储文件变大

rdbcompression yes|no

设置读写文件过程是否进行RDB格式校验,默认yes,设置为no,节约读写10%时间消耗,单存在数据损坏的风险

rdbchecksum yes|no

4.1.1.2 bgsave指令

执行该命令时,Redis 会在后台异步执行快照操作,此时 Redis 仍然可以相应客户端请求。具体操作是 Redis 进程执行 fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。Redis 只会在 fork 期间发生阻塞,但是一般时间都很短。但是如果 Redis 数据量特别大,fork 时间就会变长,而且占用内存会加倍,这一点需要特别注意。

手动启动后台保存操作,但不是立即执行.

bgsave

bgsave指令相关配置**

后台存储过程中如果出现错误现象,是否停止保存操作,默认yes

stop-writes-on-bgsave-error yes|no

其 他

dbfilename filename  
dir path  
rdbcompression yes|no  
rdbchecksum yes|no

4.1.1.2 save配置自动执行

save second changes

参数:

second:监控时间范围

changes:监控key的变化量

范例:

save 900 1 # 表示900 秒内如果至少有 1 个 key 的值变化,则触发RDB
save 300 10 # 表示300 秒内如果至少有 10 个 key 的值变化,则触发RDB
save 60 10000 # 表示60 秒内如果至少有 10000 个 key 的值变化,则触发RDB

其他相关配置:

dbfilename filename
dir path
rdbcompression yes|no
rdbchecksum yes|no
stop-writes-on-bgsave-error yes|no

4.1 RDB三种启动方式对比

4.2 AOF(过程日志)

将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程。

redis 关系型数据库中的Table redis是不是关系型数据库_redis 关系型数据库中的Table_08


AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令 达到恢复数据的目的。与RDB相比可以简单理解为由记录数据改为记录数据产生的变化

AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式

4.2.1 AOF 启动方式

启动AOF相关配置
开启AOF持久化功能,默认no,即不开启状态

appendonly yes|no

AOF持久化文件名,默认文件名为appendonly.aof,建议配置为appendonly-端口号.aof

appendfilename filename

AOF持久化文件保存路径,与RDB持久化文件保持一致即可

dir

AOF写数据策略,默认为everysec

appendfsync always|everysec|no

4.2.2 AOF执行策略(三种)

  • always(每次):每次写入操作均同步到AOF文件中数据零误差,性能较低,不建议使用

everysec(每秒):每秒将缓冲区中的指令同步到AOF文件中,在系统突然宕机的情况下丢失1秒内的数据 数据准确性较高,性能较高,建议使用,也是默认配置

  • no(系统控制):由操作系统控制每次同步到AOF文件的周期,整体过程不可控