单体架构:一台Web服务器、一台数据库服务器。
回顾,关系型数据库:基于二维表来存储数据的数据库就是关系型数据库。
MySQL跟Redis的区别:
什么是CAP模型?
- CAP模型是一种用于描述分布式系统特性的理论模型。
- CAP模型由三个关键概念组成:一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)。
- 一致性(Consistency):指的是在分布式系统中,当一个节点对数据进行修改后,其它节点立即能够看到这个修改。官方:指的是在分布式系统中,所有节点对于同一份数据的访问和操作都能保持一致的特性。
- 可用性:指的是系统能够及时响应用户请求,并一直保持可用的状态。即使系统中的某个节点发生故障或者网络出现问题,系统仍然能够继续运行。
- 分区容错性:指的是系统在面对网络分区(节点之间的通信中断或丢失)的情况下继续运行。分布式系统通常由多个节点组成,分布在不同的物理位置上,而网络分区可能导致节点之间无法直接通信。
- 根据CAP模型,分布式系统无法同时满足一致性、可用性和分区容错性这三个特性,最多只能同时满足其中的两个。
key-value结构存储:
- 基于内存去操作,没有实时的磁盘IO,数据异步刷新到磁盘。
- 本身就是Key-Value结构,类似于HashMap,一个Key会对应一个Value,通过一个Key的Hash值 取余 数组的长度-1 得到一个数组的下标,知道这个数据放在哪里,去拿的时候,直接能找到下标,所以查询速度戒心O(1)。
(1)Http://redis.io/ 英文地址
(2)Http://www.redis.cn/ 中文地址
上传Redis安装文件到Linux服务器,并且移动到/usr/local/MySoftWare目录中,接着解压:
编译Redis(编译,将.c文件编译为.o文件)
安装:make PREFIX=/home/admin/myapps/redis install
安装之后的bin目录:
Copy文件:将redis解压的文件夹中的redis.conf文件复制到安装目录
3.3.1 Redis的前端模式启动
直接运行bin/redis-server将使用前端模式启动:
前端模式启动的缺点是启动完成后,不能再进行其他操作,这个界面只能启动,启动后不能进行其他操作,如果要退出操作必须使用Ctrl+C。
修改redis.conf配置文件,找到daemonize no,将no改为yes,然后可以使用后端模式启动。
启动时,需要既指定指令,指定配置文件(这里所在文件夹是redis)
Redis默认端口:6379,通过当前服务进行查看
(1) 强制结束程序(不推荐)
(2) 正确停止Redis的方式应该是 :向Redis发送SHUTDOWN命令,方法为(关闭默认的端口)
1. 关闭Linux防火墙
2. 进入自己的redis安装目录,vim进入redis.conf修改redis.conf文件中的bind参数
接着重新启动Redis:
连接Redis:
Redis是一种基于内存的数据库,并且提供一定的持久化功能,它是一种键值(key-value)数据库,使用 key 作为索引找到当前缓存的数据,并且返回给程序调用者。
当前的 Redis 支持 6 种数据类型,它们分别是字符串(String)、列表(List)、集合(set)、哈希结构(hash)、有序集合(zset)和基数(HyperLogLog)
重点掌握前五种数据结构!!!
解释说明:
命令学习网站:Redis 命令参考 — Redis 命令参考
赋值语法:SET key value
取值语法: GET key
设置多个键值语法: MSET key value [key value …]
获取多个键值语法: MGET key [key …]
删除语法:DEL key 【key...】
递增数字:
Redis hash 是一个String类型的 field 和 value 的映射表,hash特别适合用于存储对象,常用命令:
赋值语法: HSET key/大key/一级key field-属性-小key/二级key value-属性值
取值语法: HGET key field-属性值
设置多个字段语法: HMSET key field value [field value ...]
取多个值语法: HMGET key field [field ...]
获取所有字段值语法:HGETALL key
删除字段语法:HDEL key field [field ...]
Redis的List是采用来链表来存储,双向链表存储数据,特点:增删快、查询慢(Linkedlist).这个队列是有序的。
Redis 列表是简单的字符串列表,按照插入顺序排序,常用命令:
命令 | 含义 |
---|---|
lpush key value1 [value2] | 将一个或多个值插入到列表头部 |
rpush key value1 [value2] | 将一个或多个值插入到列表尾部 |
lrange key start stop | 获取列表指定范围内的元素 |
lpop key | 移出并获取列表的第一个元素 |
rpop key | 移除并获取列表最后一个元素 |
BRPOP key1 [key2 ] timeout | 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
llen key | 获取列表长度 |
rpoplpush source dest | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
brpoplpush source dest timeout | 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
向列表左边增加元素: LPUSH key value [value ...]
从列表左边弹出元素: LPOP key(临时存储,弹出后,从队列中清除)
向列表右边增加元素 : RPUSH key value [value ...]
从列表右边弹出元素: RPOP key
获取列表中元素的个数: LLEN key
获取列表指定范围内的元素:LRANGE key start stop
将返回start、stop之间的所有元素(包含两端的元素),索引从0开始,可以是负数,如:“-1”代表最后的一个元素。
Redis set 是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,常用命令:
命令 | 含义 |
---|---|
SADD key member1 [member2] | 向集合添加一个或多个成员 |
SMEMBERS key | 返回集合中的所有成员 |
SCARD key | 获取集合的成员数 |
SINTER key1 [key2] | 返回给定所有集合的交集 |
SUNION key1 [key2] | 返回所有给定集合的并集 |
sdiff key1 [key2] | 返回所有给定集合的差集 |
SREM key member1 [member2] | 移除集合中一个或多个成员 |
添加元素语法:SADD key member1 [member2 ...]
获取集合中的所有元素 : smembers key
删除元素语法: SREM key member1 [member2 ...]
判断元素是否在集合中: SISMEMBER key member 返回1表示存在,反之0表示不存在
Redis Zset有序集合是String类型元素的集合,且不允许有重复成员。每个元素都会关联一个double类型的分数。常用命令: withscores选项代表得到对应的分数!
命令 | 含义 |
---|---|
zadd key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员 |
zrange key start stop [withscores] | 通过索引区间返回有序集合中指定区间内的成员(分数从小到大,升序排序) |
zrevrange key start stop [withscores] | 通过索引区间返回有序集合中指定区间内的成员(分数从大到小,降序排序) |
zincrby key increment member | 有序集合中对指定成员的分数加上增量 increment |
zrem key member [member ...] | 移除有序集合中的一个或多个成员 |
zcard key | 计算集合中元素的数量 |
增加元素:ZADD key score1 member1 [score2 member2 ...]
获得排名在某个范围的元素列表,并按照元素分数降序返回:
获取元素的分数:ZSCORE key member
删除元素ZREM key member [member ...]
升序排序,获得元素的分数的可以在命令尾部加上WITHSCORES参数
应用:商品销售量;学生排名等
对指定成员的分数加上增量Increment:zincrby key increment member
HyperLogLog是一种使用随机化的算法,以少量内存提供集合中唯一元素数量的近似值。
HyperLogLog可以接受多个元素作为输入,并给出输入元素的基数估算值:
基数:集合中不同元素的数量。比如 {‘apple’, ‘banana’, ‘cherry’, ‘banana’, ‘apple’} 的基数就是 3 。
估算值:算法给出的基数并不是精确的,可能会比实际稍微多一些或者稍微少一些,但会控制在合理的范围之内。