Redis超全精讲!(一)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 课程目标能够掌握Redis不同数据类型操作能够使用Java API操作Redis能够理解Redis的两种持久化方式能够理解Redis的主从复制架构能够理解Redis的Sentinel架构能够理解Redis集群架构

1.NoSQL介绍


1.1 什么是NoSQL

NoSQL最常见的解释是“non-relational”, 很多人也说它是“Not Only SQL”

NoSQL仅仅是一个概念,泛指非关系型的数据库

区别于关系数据库,它们不保证关系数据的ACID特性

NoSQL是一项全新的数据库革命性运动,提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入


1.2 NoSQL的特点

1.2.1 应用场景

高并发的读写

海量数据读写

高可扩展性

速度快

1.2.2 不适用场景

需要事务支持

基于sql的结构化查询存储,处理复杂的关系,需要即席查询(用户自定义查询条件的查询)


1.3 NoSQL数据库

1.3.1 memcache

很早出现的NoSql数据库

数据都在内存中,一般不持久化

支持简单的key-value模式

一般是作为缓存数据库辅助持久化的数据库

1.3.2 redis介绍

几乎覆盖了Memcached的绝大部分功能

数据都在内存中,支持持久化,主要用作备份恢复

除了支持简单的key-value模式,还支持多种数据结构的存储,比如 list、set、hash、zset等。

一般是作为缓存数据库辅助持久化的数据库

现在市面上用得非常多的一款内存数据库

1.3.3 mongoDB介绍

高性能、开源、模式自由(schema free)的文档型数据库

数据都在内存中, 如果内存不足,把不常用的数据保存到硬盘

虽然是key-value模式,但是对value(尤其是json)提供了丰富的查询功能

支持二进制数据及大型对象

可以根据数据的特点替代RDBMS ,成为独立的数据库。或者配合RDBMS,存储特定的数据。

1.3.4 列式存储HBase介绍

HBase是Hadoop项目中的数据库。它用于需要对大量的数据进行随机、实时读写操作的场景中。HBase的目标就是处理数据量非常庞大的表,可以用普通的计算机处理超过10亿行数据,还可处理有数百万列元素的数据表。


2. Redis介绍


redis官网地址:

https://redis.io/

中文网站

http://www.redis.cn/


2.1 Redis的基本介绍

Redis是当前比较热门的NoSQL系统之一

它是一个开源的、使用ANSI C语言编写的key-value存储系统(区别于MySQL的二维表格形式存储)

和Memcache类似,但很大程度补偿了Memcache的不足,Redis数据都是缓存在计算机内存中,不同的是,Memcache只能将数据缓存到内存中,无法自动定期写入硬盘,这就表示,一断电或重启,内存清空,数据丢失


2.2 Redis的应用场景

计数器

TopN、排行榜(微博的热搜榜、热门话题、抖音直播间的热门直播间、淘宝电商的排行榜)

去重的计数

实时系统,用于存储一些规则

定时过期的一些应用(短信验证码)

缓存(保护数据库不被高并发压垮)

2.2.1 取最新N个数据的操作

比如典型的取网站最新文章,可以将最新的5000条评论ID放在Redis的List集合中,并将超出集合部分从数据库获取


2.2.2 排行榜应用,取TOP-N操作

这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,可以使用Redis的sorted set,将要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可


2.2.3 需要精准设定过期时间的应用

比如可以把上面说到的sorted set的score值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了,不仅是清除Redis中的过期数据,你完全可以把Redis里这个过期时间当成是对数据库中数据的索引,用Redis来找出哪些数据需要过期删除,然后再精准地从数据库中删除相应的记录。


2.2.4 计数器应用

Redis的命令都是原子性的,你可以轻松地利用INCR,DECR命令来构建计数器系统。


2.2.5 Uniq操作,获取某段时间所有数据排重值

这个使用Redis的set数据结构最合适了,只需要不断地将数据往set中扔就行了,set意为集合,所以会自动排重。


2.2.6 实时系统,反垃圾系统

通过上面说到的set功能,你可以知道一个终端用户是否进行了某个操作,可以找到其操作的集合并进行分析统计对比等。没有做不到,只有想不到。


2.2.7 缓存

将数据直接存放到内存中,性能优于Memcached,数据结构更多样化。


2.3 Redis的特点

高效性


速度非常快,单机能够支持的并发、读写的速度达10W以上(Kafka更快——80W-150W)

原子性


Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。

支持多种数据结构类型,操作非常灵活


string(字符串)

list(列表)

hash(哈希)

set(集合)

zset(有序集合)

稳定性:持久化,主从复制(集群)


其他特性:支持过期时间,支持事务,消息订阅。


3. Redis单机环境安装(Linux)


3.1 下载redis安装包

bigdata-pro-m07服务器执行以下命令下载redis安装包

cd /opt/software
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
chmod u+x redis-3.2.8.tar.gz


3.2 解压redis压缩包到指定目录

tar -zxvf redis-3.2.8.tar.gz -C /opt/modules/


3.3 安装C程序运行环境

yum -y install gcc-c++



3.4 安装较新版本的tcl

3.4.1 使用压缩包进行安装

cd /opt/software
wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
chmod u+x tcl8.6.1-src.tar.gz
# 解压tcl
tar -zxvf tcl8.6.1-src.tar.gz -C /opt/modules/
# 进入指定目录
cd /opt/modules/tcl8.6.1/unix
# 进入root
su
./configure
make  && make  install

3.4.2 在线安装tcl(推荐)

yum  -y  install  tcl


3.5 编译redis

cd /opt/modules/redis-3.2.8
#或者使用命令  make  进行编译
make MALLOC=libc  
make test && make install PREFIX=/opt/modules/redis-3.2.8


3.5.1 修改redis配置文件

cd /opt/modules/redis-3.2.8
mkdir log
mkdir data
vim redis.conf
# 修改第61行
bind node1.itcast.cn
# 修改第128行
daemonize yes
# 修改第163行
logfile "/opt/modules/redis-3.2.8/log/redis.log"
# 修改第247行
dir /opt/modules/redis-3.2.8/data

3.5.2 启动redis

cd  /opt/modules/redis-3.2.8/
bin/redis-server  redis.conf

3.5.3 关闭redis

bin/redis-cli -h bigdata-pro-m07 shutdown

注意:

  • 在生产环境,关闭redis的时候,不用使用 kill -9,应该使用redis-cli -h 主机名 -p 端口 shutdown
  • 因为如果直接kill -9,可能redis的一些数据会丢失

3.5.4 连接redis客户端

bin/redis-cli -h bigdata-pro-m07

4.png


4. Redis的数据类型


redis当中一共支持五种数据类型,分别是:


string字符串

list列表

set集合

zset有序集合

通过这五种不同的数据类型,可以实现各种不同的功能,也可以应用在各种不同的场景。

5.png


Redis当中各种数据类型结构如上图:

Redis当中各种数据类型的操作

https://www.runoob.com/redis/redis-keys.html


4.1 对字符串string的操作

下表列出了常用的 redis 字符串命令

6.png7.png

注意:

  • 在执行一些累加器的操作时,千万不能使用 set/get来操作
  • 要使用INCR/DESC/INCRBY

8.png

4.2 对hash列表的操作

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

Redis 中每个 hash 可以存储 2的32次方 - 1 键值对(40多亿)

下表列出了 redis hash 基本的相关命令:

9.png


4.3 对list列表的操作

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

一个列表最多可以包含 2的32次方 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

下表列出了列表相关的基本命令:

10.png11.png


4.4 对set集合的操作

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

下表列出了 Redis 集合基本命令:

12.png


4.5 对key的操作

下表给出了与 Redis 键相关的基本命令:13.png


4.6 对ZSet的操作

Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员

它用来保存需要排序的数据,例如排行榜,一个班的语文成绩,一个公司的员工工资,一个论坛的帖子等。

有序集合中,每个元素都带有score(权重),以此来对元素进行排序

它有三个元素:key、member和score。以语文成绩为例,key是考试名称(期中考试、期末考试等),member是学生名字,score是成绩。

下表列出了列表相关的基本命令:

14.png15.png

4.7 对位图BitMaps的操作

计算机最小的存储单位是位bit,Bitmaps是针对位的操作的,相较于String、Hash、Set等存储方式更加节省空间

Bitmaps不是一种数据结构,操作是基于String结构的,一个String最大可以存储512M,那么一个Bitmaps则可以设置2^32个位

Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同。可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量16.png

  • BitMaps 命令说明:将每个独立用户是否访问过网站存放在Bitmaps中, 将访问的用户记做1, 没有访问的用户记做0, 用偏移量作为用户的id 。


4.7.1 设置值

SETBIT key offset value

setbit命令设置的vlaue只能是0或1两个值


设置键的第offset个位的值(从0算起),假设现在有20个用户,uid=0,5,11,15,19的用户对网站进行了访问, 那么当前Bitmaps初始化结果如图所示

17.png


具体操作过程如下, unique:users:2016-04-05代表2016-04-05这天的独立访问用户的Bitmaps

setbit unique:users:2016-04-05 0 1
setbit unique:users:2016-04-05 5 1
setbit unique:users:2016-04-05 11 1
setbit unique:users:2016-04-05 15 1
setbit unique:users:2016-04-05 19 1

很多应用的用户id以一个指定数字(例如10000) 开头, 直接将用户id和Bitmaps的偏移量对应势必会造成一定的浪费, 通常的做法是每次做setbit操作时将用户id减去这个指定数字。

在第一次初始化Bitmaps时, 假如偏移量非常大, 那么整个初始化过程执行会比较慢, 可能会造成Redis的阻塞。


4.7.2 获取值

GETBIT key offset
  • 获取键的第offset位的值(从0开始算),例:下面操作获取id=8的用户是否在2016-04-05这天访问过, 返回0说明没有访问过
getbit unique:users:2016-04-05 8

4.7.3 获取Bitmaps指定范围值为1的个数

BITCOUNT key [start end]

例:下面操作计算2016-04-05这天的独立访问用户数量:

bitcount unique:users:2016-04-05

4.7.4 Bitmaps间的运算

BITOP operation destkey key [key, …]
  • bitop是一个复合操作, 它可以做多个Bitmaps的and(交集) 、 or(并集) 、 not(非) 、 xor(异或) 操作并将结果保存在destkey中。 假设2016-04-04访问网站的userid=1, 2, 5, 9, 如图3-13所示:19.png
setbit unique:users:2016-04-04 1 1
setbit unique:users:2016-04-04 2 1
setbit unique:users:2016-04-04 5 1
setbit unique:users:2016-04-04 9 1

例1:下面操作计算出2016-04-04和2016-04-05两天都访问过网站的用户数量, 如下所示。

bitop and unique:users:and:2016-04-04_05 unique:users:2016-04-04 unique:users:2016-04-05
bitcount unique:users:2016-04-04_05

例2:如果想算出2016-04-04和2016-04-03任意一天都访问过网站的用户数量(例如月活跃就是类似这种) , 可以使用or求并集, 具体命令如下:

bitop or unique:users:or:2016-04-04_05 unique:users:2016-04-04 unique:users:2016-04-05
bitcount unique:users:or:2016-04-04_05

20.png


4.8 对HyperLogLog结构的操作

4.8.1 应用场景

HyperLogLog常用于大数据量的统计,比如页面访问量统计或者用户访问量统计。


要统计一个页面的访问量(PV),可以直接用redis计数器或者直接存数据库都可以实现,如果要统计一个页面的用户访问量(UV),一个用户一天内如果访问多次的话,也只能算一次,这样,我们可以使用SET集合来做,因为SET集合是有去重功能的,key存储页面对应的关键字,value存储对应的userid,这种方法是可行的。但如果访问量较多,假如有几千万的访问量,这就麻烦了。为了统计访问量,要频繁创建SET集合对象。


Redis实现HyperLogLog算法,HyperLogLog 这个数据结构的发明人 是Philippe Flajolet(菲利普·弗拉若莱)教授。Redis 在 2.8.9 版本添加了 HyperLogLog 结构。


4.8.2 UV计算示例

bigdata-pro-m07:6379> help @hyperloglog
  PFADD key element [element ...]
  summary: Adds the specified elements to the specified HyperLogLog.
  since: 2.8.9
  PFCOUNT key [key ...]
  summary: Return the approximated cardinality of the set(s) observed by the HyperLogLog at key(s).
  since: 2.8.9
  PFMERGE destkey sourcekey [sourcekey ...]
  summary: Merge N different HyperLogLogs into a single one.
  since: 2.8.9

Redis集成的HyperLogLog使用语法主要有pfadd和pfcount,顾名思义,一个是来添加数据,一个是来统计的。为什么用pf?是因为HyperLogLog 这个数据结构的发明人 是Philippe Flajolet教授 ,所以用发明人的英文缩写,这样容易记住这个语法了。


下面我们通过一个示例,来演示如何计算uv。

bigdata-pro-m07:6379> PFADD uv1 user1
(integer) 1
bigdata-pro-m07:6379> pfcount uv1
(integer) 1
bigdata-pro-m07:6379> pfadd uv1 user2
(integer) 1
bigdata-pro-m07:6379> pfcount uv1
(integer) 2
bigdata-pro-m07:6379> pfadd uv1 user3
(integer) 1
bigdata-pro-m07:6379> pfcount uv1
(integer) 3
bigdata-pro-m07:6379> pfadd uv1 user4
(integer) 1
bigdata-pro-m07:6379> pfcount uv1
(integer) 4
bigdata-pro-m07:6379> pfadd uv1 user5 user6 user7 user8 user9 user10
(integer) 1
bigdata-pro-m07:6379> pfcount uv1
(integer) 10
bigdata-pro-m07:6379> pfadd uv1 user5 user6 user7 user8 user9 user1
(integer) 0
bigdata-pro-m07:6379> pfcount uv1
(integer) 10

HyperLogLog算法一开始就是为了大数据量的统计而发明的,所以很适合那种数据量很大,然后又没要求不能有一点误差的计算,HyperLogLog 提供不精确的去重计数方案,虽然不精确但是也不是非常不精确,标准误差是 0.81%,不过这对于页面用户访问量是没影响的,因为这种统计可能是访问量非常巨大,但是又没必要做到绝对准确,访问量对准确率要求没那么高,但是性能存储方面要求就比较高了,而HyperLogLog正好符合这种要求,不会占用太多存储空间,同时性能不错


pfadd和pfcount常用于统计,需求:假如两个页面很相近,现在想统计这两个页面的用户访问量呢?这里就可以用pfmerge合并统计了,语法如例子:

bigdata-pro-m07:6379> pfadd page1 user1 user2 user3 user4 user5
(integer) 1
bigdata-pro-m07:6379> pfadd page2 user1 user2 user3 user6 user7
(integer) 1
bigdata-pro-m07:6379> pfmerge page1+page2 page1 page2
OK
bigdata-pro-m07:6379> pfcount page1+page2
(integer) 7

4.8.3 HyperLogLog为什么适合做大量数据的统计

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

什么是基数?

比如:数据集{1, 3, 5, 7, 5, 7, 8},那么这个数据集的基数集{1, 3, 5, 7, 8},基数(不重复元素)为5。基数估计就是在误差可接受的范围内,快速计算基数。




相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
缓存 NoSQL 应用服务中间件
|
6月前
|
消息中间件 NoSQL 编译器
Redis入门
Redis入门
56 0
|
6月前
|
NoSQL 关系型数据库 MySQL
redis 入门01
redis 入门01
38 0
|
缓存 NoSQL 关系型数据库
redis系列1-入门
redis系列1-入门
42 0
|
存储 监控 负载均衡
Redis 从入门到弃坑
Redis 从入门到弃坑
118 0
|
存储 缓存 NoSQL
(三)、Redis入门
(三)、Redis入门
|
消息中间件 SQL NoSQL
Redis初入门(一)
本文站在入门者的角度简单介绍了一下Redis,并列举了部分常用操作
|
消息中间件 存储 缓存
Redis入门(一)
Redis入门
247 1
|
消息中间件 存储 缓存
redis 入门-redis 简介| 学习笔记
快速学习 redis 入门-redis 简介