Nosql
1 为什么要用Nosql
2 Nosql的四大分类
Redis入门
Remote Dictionary Server
1 能做什么
-
内存存储,持久化存储
-
效率高,可以用于高速缓存
-
发布订阅系统
-
地图信息分析
-
计时器、计数器
2 特性
-
数据类型多样
-
持久化
-
集群
-
事务
3 开始
4 基础命令
-
select 切换数据库
-
set key value 添加一条记录
-
Keys * 查看当前数据库所有key
-
dbsize 查看数据库大小
-
Flushdb 清空当前数据库的keys
-
flushall 清除全部数据库数据
-
EXISTS key 判断是否存在
-
Move key 1 移除记录
-
EXPIRE key 10 设置过期时间,单位是秒
-
ttl key 查看当前key的剩余时间
-
type key 查看类型
5 重要知识
Redis数据类型
1. String
String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。
-
APPEND key "xxx" 增加一串字符
-
STRLEN key 获取字符串长度
-
Incr key 加一操作
-
decr key 减一
-
GETRANGE key 1 3 获取从一到三的字串
-
SETRANGE key 1 xx 更改字串
-
setex 设置过期时间
-
setnx 如果不存key才设置(分布式锁)
-
mset 批量操作,是原子性的
-
mget
-
mset user:1:name zhangsan user:1:age2
-
Getset
2. List
实际是一个链表,两边插入或改动效率较高,中间效率会低一些。
-
在redis里面可以将list实现成栈,队列等。
-
LPUSH list value
-
LRANGE list 0 -1 显示list中所有元素
-
LRANGE list 0 1 显示指定范围元素
-
RPUSH value 添加到最下面
-
LPOP
-
RPOP
-
Llenth list 获取list长度
-
Lrem list 1 one 移除一个值为one的
-
LTRIM list 1 2 截断,1之前2之后的元素都没了
-
RPUSHLPOP list1 list2 移除列表中最后一个元素并且移动到新的列表中
-
LSET list 1 value 更改1号元素的值
-
LINSERT list before "value1" "value2"在value1前面插入value2
-
LINSERT list after
3. SET
-
sadd myset "hello"; 添加元素
-
sismember myset hello; 确认是否存在
-
smenbers myset 返回所有元素
-
srem myset hello 删除元素
-
smove set1 set2 移动元素
-
SDIFF set1 set2 差集 set1-set2
-
sinter set1 set2 交集
-
sunion set1 set2 并集
4. Hash
Map集合,存储<key,value>
-
Set myhash key value
-
hmset myhash key1 value1 key2 value2
-
hmget myhash key1 key2
-
hgetall myhash
-
hdel myhash key1
-
hlen myhash
-
hexists myhash key1 判断是否存在
-
hkeys myhash 只获得所有keys
-
hvals myhash 只获得所有value
-
hincrby myhash key 1 增一
-
hsetnx myhash key1 hello 如果不存在可以设置
5. Zset(有序集合)
-
zadd myset 1 one
特殊数据类型
1. geospatial
地理位置数据
2. hyperloglog
占用内存固定
3. BitMap
所有操作二进制位来进行记录,就只有0和1两个状态
事务
-
redis单条命令不保证原子性
-
没有隔离级别的概念
执行顺序
-
开启事务 multi,后面的命令就在事务中了
-
命令入队
-
执行事务 exec
-
放弃事务 discard
正常执行事务
multi
set k1 v1
set k2 v2
get k2
set k3 v3
exec
编译型异常:所有事务不会执行
运行时异常:1/0 如果事务队列中存在语法性错误,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常!
悲观锁
-
无论做什么都加锁
乐观锁
-
watch 监视对象
-
如果其他线程修改了watch的对象,提交事务执行就会出错,不能执行成功
-
unwatch 解锁
-
执行时比较刚监视的时候的值,如果有改变就执行失败
Jedis
SpringBoot 采用lettuce,使用netty连接,线程安全。
Jedis jedis = new Jedis("127.0.0.1",6379);
jedis.set("name","nanxi");
Transaction transaction = jedis.multi();
try{
transaction.set("name","abc");
transaction.exec();
}catch (Exception e){
transaction.discard();
}finally {
System.out.println(jedis.get("name"));
}
SpringBoot
Redistemplate redistemplate;
redistemplate opsForList;
lettuce传输数据会序列化
// 存储java对象,序列化
// 配置自定义序列化方法,默认jdk序列化会传输乱码
Student student = new Student();
student.setId(9527L);
student.setName("nanxi");
student.setAge(22);
student.setEmail("[email protected]");
String jsonStudent = new ObjectMapper().writeValueAsstring(student);
redistemplate.opsForValue().set("student",jsonStudent);
redistemplate.opsForValue().set(key,value);
Set<Object> set1 = new HashSet<>();
Set<Object> set2 = new HashSet<>();
//redis事务
Jedis jedis = new Jedis("127.0.0.1",6379);
jedis.set("name","nanxi");
Transaction transaction = jedis.multi();
try{
transaction.set("name","abc");
transaction.exec();
}catch (Exception e){
transaction.discard();
}finally {
System.out.println(jedis.get("name"));
}
Redis.conf
-
配置文件unit单位对大小不敏感。
-
可以包含多个配置文件+路径
-
网络配置
-
快照
持久化,在规定时间内,执行了多少次操作,则会持久化到文件.rdb.aof
-
安全
-
客户端限制
-
APPEND ONLY
-
appendonly no 默认是不开启aof模式的,使用rdb方式持久化。
-
appendfsync everysec 每秒执行一次同步
-
Redis持久化
RDB(Redis DataBase)
-
触发机制:
-
启动就会自动恢复其中的数据
-
优点:适合大规模的数据恢复;对数据一致性要求不高。
缺点:需要一定的时间间隔进程操作,如果redis宕机最后一次数据就没有了,持久化时会开一个子进程,利用内存空间。
AOF (Append Only File)
-
以日志的形式将所有写操作记录下来,需要数据恢复的时候重写就是了,默认是不开启的。
优点:
缺点:
-
数据文件较大,数据恢复慢
-
运行效率低
-
Redis发布订阅
Redis主从复制
1主多从
-
数据复制是单向的,读写分离
-
数据冗余,故障恢复,负载均衡,高可用基石
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0 #没有从机
master_failover_state:no-failover
master_replid:51e20a80a5cde6f38c457e742fe61c06bed3b3a9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
可以配置单机多集群,使用不同的配置文件。
slaveof ipadress port
#配置成主机的从机
在配置文件中的配置是永久的配置。
从机不能执行写操作。掉线的从机重连数据会同步。
-
全量复制
-
增量复制
层次模式:主--从--从
slaveof no one 从机变成主机
原主机回来也没用了。
哨兵模式
sentinel.conf 哨兵的配置文件,需要配置它监听的主机。
优点:
-
哨兵集群基于主从复制模式,所有的主从配置优点,有权游。主从可以切换,故障可以转移。更加健壮。
-
-
端口号
-
sentinel.conf工作目录
-
监视目录。
-
Redis缓存穿透和雪崩
redis缓存中没有的话,请求会到持久层MysqL,请求过多时造成服务器崩掉。
布隆过滤器
布隆过滤器是一种数据结构,对所有可能差选的参数以hash的形式存储,在控制层先进行校验,不符合则丢弃,从而避免了对底层存储系统的查询压力。
缓存空对象
热点数据不过期,设置分布式锁
停掉一些服务,保证主要的服务可用
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。