Redis学习笔记

认识NoSQL

NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题。

NoSQL特点

方便扩展(数据之间没有关系,很好扩展)
大数据高性能
数据类型是多样型的(不需要事先设计数据库随取随用)

NoSQL分类

KV键值对:redis
文档型数据库:MongoDB(基于分布式文件存储的数据库)
列存储数据库:HBase
图关系型数据库:Neo4j

Redis概述

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI
C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis可以做什么

1、内存存储,持久化
2、效率高,可用于告诉缓存
3、地图信息分析
4、计时器、计数器 等

Redis基础

redis默认有16个数据库,默认使用第0个数据库
redis 是单线程的

Redis五大基本数据类型

字符串(string)

set 添加
get 获取
append 添加
strlen key长度
incr +1
decr -1
incrby 步长 +10 +50
decrby 步减 -10 -50
getrange 获取字符串范围
setrange 替换指定位置开始的字符串
setex 设置过期时间
setnx 不存在设置(如果不存在,添加 如果存在 添加失败),分布式锁中会常用
mset 同时获取多个值
mget 同时获取多个值

散列(hash)

map集合
hset 添加一个具体的key-value
hmset set多个key-value
hmget 获取多个字段值
hgetall 获取全部的数据
hdel 删除hash指定的key字段
hlen 获取hash表的字段数量	
hkeys 获取所有的key
hvals 获取所有的value
hsetns 如果不存在则可以设置,如果存在则不能设置

列表(list)

所有的list命令都是L开头的,Redis命令不区分大小写
LPUSH list one 将一个值或者多个值,插入到列表头部(左)
LRANGE list 0 -1 获取list中值
LRANGE list 0 1 通过区间获取具体的值
Rpush 将一个值或者多个值,插入到列表尾部(右)

LPOP 左移除,移除List的第一个元素
RPOP 右移除,移除List的最后一个元素
lindex 通过下标获得list中的某一个值
Llen list 返回列表的长度
Lrem 移除指定的值
ltrim 通过下标截取指定长度
rpoplpush : 移除列表的最后一个元素,将他移动到新的列表中
exists 判断这个列表是否存在
lset 将列表中指定下标的值替换为另外一个值,相当于更新操作
linsert 将某个具体的value插入到列中的某个元素的前面或者后面

集合(set)

set中的值是不会重复的

sadd set集合中添加指定值
smembers 查看指定set的所有值
sismember 判断某一个值是不是在set集合中
scard 获取set集合中的内容元素的个数
srem 移除set集合中的指定元素
SRANDMEMBER 随机抽选出一个元素
spop 随机删除一些set集合中的元素
smove 将一个指定的值,移动到另一个set集合中
SDIFF 差集
SINTER 交集
SUNION 并集

有序集合(Zset)

zadd 添加
zrangebyscore key -inf(负无穷) +inf(正无穷) 显示全部用户 从小到大排序
zrevrange 从小到大排序
zrangebyscore key -inf +inf withscores 显示全部的用户并且附带成绩
zrangebyscore key -inf 2500 withscores 显示工资小于2500员工的升序排序
zrange 获取所欲值
zrem 移除有序集合中的指定元素
zcard 获取有序集合的个数
zcount 获取指定区间的成员数量

Redis三种特殊数据类型

geospatial 地理位置

geoadd 添加地理位置
规则:两极(南北极)无法直接添加,我们一般会下载城市数据,直接通过Java程序一次性导入
参数:key 值(经度、纬度、城市名称)
geopos 获得当前定位,一定是一个坐标值 获取指定的城市的经度、纬度
geodist: 获取两个位置之间的距离
georadius:以给定的经纬度为中心,找出某一半径内的元素
georadiusbymember:找出位于指定元素周围的其他元素
geohash:返回一个或多个位置元素
该命令将返回11个字符的Geohash字符串
将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么距离越近

geo的底层原理,其实就是Zset
zrange key 0 -1 查看地图中全部的元素
zrem key 移除指定元素

hyperloglog

PFadd mykey a b c d e f g 创建第一组元素mykey
PFcount mykey 统计mykey元素的基数数量
PFadd mykey2 i g h j 创建第二组元素mykey2
PFMERGE mykey3 mykey mykey2 合并两组 mykey mykey2 ==> mykey3 并集

Bitmaps:位存储

以打卡为例
1、存入打卡数据
setbit sign(打卡定义) 0(打卡日期 第一天) 1(是否打卡)
setbit sign 1 0
setbit sign 2 0
setbit sign 3 1
setbit sign 4 1
setbit sign 5 0
setbit sign 6 0

2、查看某一天是否打卡
getbit sign(打卡定义) 3(是哪天)

3、操作统计打卡天数
bitcount sign 

Redis事务

事务本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行
redis 单条命令是保证原子性的,但是事务不保证原子性
redis 没有隔离级别的概念

三个阶段
开启事务:multi
命令入队:正常命令
执行事务:exec

放弃事务:discard

redis锁(监控)watch

Redis整合Java

Jedis(redis官方推介的Java连接开发工具)
使用Java操作Redis
操作命令与黑窗口命令一致

public static void main(String[] args) {
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.flushDB();
        System.out.println("===========增加数据===========");
        System.out.println(jedis.set("key1","value1"));
        System.out.println(jedis.set("key2","value2"));
        System.out.println(jedis.set("key3", "value3"));
        System.out.println("删除键key2:"+jedis.del("key2"));
        System.out.println("获取键key2:"+jedis.get("key2"));
}
public static void main(String[] args) {
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.flushDB();
        Map<String,String> map = new HashMap<String,String>();
        map.put("key1","value1");
        map.put("key2","value2");
        map.put("key3","value3");
        map.put("key4","value4");
        //添加名称为hash(key)的hash元素
        jedis.hmset("hash",map);
        //向名称为hash的hash中添加key为key5,value为value5元素
        jedis.hset("hash", "key5", "value5");
        System.out.println(jedis.hgetAll("hash"));//return Map<String,String>
}      	
	

Redis整合SpringBoot

提供了RedisTemplate  
其中包含了opsForValue() 字符串
		  opsForList() 列表
		  opsForSet() set集合
		  opsForZSet() zset有序集合
		  opsForHash() hash 

Redis持久化

RDB

rdb保存的文件是dump.rdb 都是在我们配置文件中快照中进行配置的	
触发机制:
1、save的规则满足的情况下,会自动触发RDB规则
2、执行flushall命令,也会触发我们的RBD规则
3、退出redis,也会产生rdb文件
如何恢复rdb文件:
只需要将rdb文件放在我们redis启动目录下就可以,redis启动的时候会自动检查dump.rdb 恢复其中的数据
优点:
1、适合大规模的数据恢复
2、对数据的完整性要求不高
缺点:
1、需要一定的时间间隔进行操作,如果redis意外宕机了,这个最后一次修改的数据就没有了
2、fork进程的时候,会占用一定的内存空间

AOF

将我们的所有命令都记录下来,以日志的形式进行记录,只追加文件,不修改文件
	  
aop保存的是appendonly.aof文件

默认是不开启的,需要手动配置 我们只需要将appendonly 改为yes 就开启AOF了
重启,redis就可以生效了
如果这个aof文件有错位,这时候redis是启动不起来的,我们需要修复aof文件
redis给我们提供了一个工具redis-check-aof --fix
如果文件正常,重启就恢复了

优点:
1、每一次修改都同步,文件的完整性会更好
2、每秒同步一次,可能会丢失一秒数据
3、从不同步,效率最高
缺点:
1、相对数据文件来,aof远远大于rdb,修复的速度也比rdb慢
2、aof运行效率也要比rdb慢,所以我们redis默认的配置就是rdb持久化

Redis发布和订阅

PUBLISH channel message 将信息发送到指定的频道
SUBSCRIBE channel 订阅给定的一个或多个频道的信息

Redis主从复制

主要包括内容:
数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式
故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复,实际上是一种服务的冗余
负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务
高可用(集群)基石:除了上诉作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

环境配置:
只配置从库,不用配置主库
info replication 查看当前库的信息

复制多分redis.conf文件
主要修改内容 端口 port
pidfile 
logfile
dump.rdb文件

redis 启动:
redis-cli -p 端口

一主二从
默认情况下,每台redis服务器都是主节点,我们一般情况下只用配置从机就好了

配置从机 slaveof ip 主机端口

真实的主从配置应该在配置文件中配置(有个replicaof <主机ip> <主机端口>),这样的话是永久的,命令(slaveof ip 主机端口)是暂时的

Redis-哨兵模式(redis-sentinel)

1、配置哨兵监控
vim redis-sentinel
在里边配置监控对象:
sentinel monitor 被监控的名称 监控主机ip 监控主机端口号 1(在后边一定要加上一个1 代表投票)
2、启动哨兵

哨兵模式规则:
如果主机宕机了,那么会从从机中投票选取一个主机,此时主机修复好了回来以后只能当从机了

优点:
1、哨兵集群。基于主从复制模式,所有主从配置的优点,它全有
2、主从可以切换,故障可以转移,系统的可用性就会更好
3、哨兵模式就是主从模式的升级,手动到自动,更加健壮
缺点:
1、redis不好在线扩容,集群容量一旦到达上限,在线扩容十分麻烦
2、实现哨兵模式的配置是非常麻烦的,里边有很多选择

学习参考视频:https://www.bilibili.com/video/BV1S54y1R7SB/?spm_id_from=333.337.search-card.all.click

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值