【JAVAweb~redis】

redis数据库

  • 1. NOSQL
  • 2.Redis概述
    • 2.1Redis 是什么?
    • 2.2Redis能做什么?
  • 3Redis windows安装。
    • Redis-key
  • 4.五大基本数据类型
    • 4.1 String 类型
    • 4.2 hash
    • 4.3 list
    • 4.4 set
    • 4.5 zset
  • 事务
    • 命令
    • 事务练习
    • 乐观锁
  • Redis持久化
    • RDB(Redis DataBase)
    • AOF(Append Only File)
  • Redis发布订阅

1. NOSQL

nosql,即not only SQL(不仅仅是SQL);泛指非非关系型数据库,随着web2.0的诞生,传统的关系型数据库面对这个时代很难解决一些问题,如超大规模的高并发社区;NoSQL发展迅速,尤其是Redis,该技术已经成为我们需要掌握的技术

2.Redis概述

2.1Redis 是什么?

Redis(即Remote Dictionary Server)远程字典服务,它是一个开源的使用c语言编写,支持网络、可基于内存亦可持久化的日志型、key_value数据库,也叫结构化数据库。

2.2Redis能做什么?

1.内存存储、持久化,内存中是断电就消失,可见持久化很是重要。
2.它的效率极高,可以用于高速缓存。
3.发布订阅系统。
4.地图信息分析等。

3Redis windows安装。

1.将下载到的压缩包解压到自己要放的盘符中
【JAVAweb~redis】_第1张图片2.将该路径配置到环境变量中即可。
3.在cmd窗口,输入命令redis-server,打开服务器端;
【JAVAweb~redis】_第2张图片

4.重开一个cmd,输入redis-cli,就连接成功了。
【JAVAweb~redis】_第3张图片

Redis-key

select 3 选择数据库3;
keys * 查看所有key对应的值;
exists key 判断key是否存在,存在返回1,否则返回0 ;
move key 1 表示将该key从1这个数据库中移除;
expire key 时间 设置该key的超时时间,单位是秒,-1表示永久有效,-2表示已经失效;
ttl key 是用于查看该key的剩余时间;
type key 查看该key的数据类型;
del key 删除键值对。
【JAVAweb~redis】_第4张图片

4.五大基本数据类型

String,hash,list,set,zset(sorted set);

4.1 String 类型

设置对象1的各个属性,用:连接;set user:1:name lisi user:1:age 48
getset key value 先get在set,返回 key 对应的值,并修改为value,不存在返回nil;

【JAVAweb~redis】_第5张图片
【JAVAweb~redis】_第6张图片

set key value  设置一个键值对
get key value 通过key获取一个键值对值;

在这里插入图片描述

mset key value[key value...多对]设置多对键值对;
mget key[key...多个] 通过key获取对应的值。

【JAVAweb~redis】_第7张图片

setex key second  value 它相当于是set 和 expire命令的合成;
设置一个键值对,并且设置它的超时时间。

【JAVAweb~redis】_第8张图片

setnx key value 先判断键值对是否存在,不存在则增加键值对,存在则不变;

【JAVAweb~redis】_第9张图片

setrange key offset value 从key的值对应位置开始替换字符串的值,若没有则在后面追加;
getrange key start end 获取【start,end】区间范围内的字符串,想拿到全部,则end为-1;

【JAVAweb~redis】_第10张图片

incr key key对应的值加1;
decr key key对应的值减1;
incrby key n  key对应的值加 n;
decrby key n key对应的值减n;

【JAVAweb~redis】_第11张图片

strlen key 获取key对应值的字符长度;
append key value 在该key对应值的后面追加字符串 value;

【JAVAweb~redis】_第12张图片

4.2 hash

hset key field value  保存该key对象的一个属性和属性的值。
hget key field value 获取key对象的属性对应的属性值。

在这里插入图片描述

hmset key field value[field value...] 保存该key对象的过个属性极其对应属性的值。
hmget key field [field...]  获取该key对象的多个属性对应的属性值。

【JAVAweb~redis】_第13张图片

hexists key field  判断该key对象的属性是否存在;
hdel key field [field] 根据key对象的属性名称删除属性及值;
hkeys key 获取key对象的所有属性
hvals key 获取key对象所有的值
hgetall key 获取该key对象所有的属性和值
hlen key 获取key对象的属性的个数。

【JAVAweb~redis】_第14张图片

4.3 list

lpush key value [value...] 列表头部增加多个数据。
rpush key value [value...]列表尾部增加多个数据。
lrange key start end  遍历列表。
linsert key before|after pivot value 在一个元素前/后插入数据。

【JAVAweb~redis】_第15张图片

lpop key  删除并且获取key对应的list的第一个元素。
rpop key 删除并且获取key对应的list的最后一个元素。
llen key 获取列表的长度。
lindex key index 获取列表中索引对应的元素
ltrim key start stop 获取列表中【start,stop】组成的新的列表。

【JAVAweb~redis】_第16张图片

4.4 set

它是一个无序的集合。

sadd key value[value...] 添加多个数据到key集合中。
smembers key 获取key集合中所有的数据。
sismember key value 判断value是否在key集合中存在。
scard key 获取set的元素个数。
sinter key[key...] 获取多个集合的交集。
sdiff key[key...]  获取多个集合的差集。
sunion key[key...] 获取多个集合的并集。

【JAVAweb~redis】_第17张图片【JAVAweb~redis】_第18张图片

4.5 zset

它是一个有序的集合,按照权重score进行排序

zadd key score value [score value] 添加多个带权重的数据到key集合中。
zrange key start stop  获取指定范围内的所有元素。
zcard key 返回元素个数。
zcount key min max 返回score值在min和max之间的数据个数。
zscore key member 返回集合中某个元素的score值。

【JAVAweb~redis】_第19张图片

事务

注意:Redis单条命令保证原子性,但是事务是不保证原子性的!
它的本质是一组命令的集合,一个事务中的所有命令都会进行序列化,在事务执行过程中是按顺序执行的;
它的特性有:一次性,顺序性,排他性;

命令

开启事务: multi;
执行事务:exec;
放弃事务:discard;

事务练习

1.开启,提交事务
【JAVAweb~redis】_第20张图片2.开启,放弃事务;
【JAVAweb~redis】_第21张图片3.如果我们在开启事务后,执行命令语句进行设置,查看等操作时,将命令写错,或是不完整,回车会报错,那么该事务提交后,一个语句也不会被执行;它对应Java的编译时异常。
【JAVAweb~redis】_第22张图片
4.我们在开启事务后,执行命令语句进行设置,例如给设置的字符串进行incr加1操作,我们都知道字符串是不能加1的,但是在redis事务中,它在提交之前是不会报错的,提交之后会报错,但他后面的语句可以正常提交。
【JAVAweb~redis】_第23张图片

乐观锁

watch命令可以为Redis事务提供CAS乐观锁行为,它可以在exec命令执行之前,监视任意key值的变化,也就是说当多个线程更新同一个key值的时候,会跟原值做比较,一旦发现它被修改过,则拒绝执行命令,并且会返回nil给客户端。
我们设置一个年龄,在一个事务中让它加1,但提交之前,在另一个客户端也进行加1,它会发生什么呢?
【JAVAweb~redis】_第24张图片它并没有像MySQL一样会提交失败,要想和MySQL一样,就需要使用watch监听;

模拟银行金钱增减:
【JAVAweb~redis】_第25张图片
不难发现加了watch监听后,在修改钱数的事物提交之前,另一个用户对金钱进行了操作之后,再提交事务发现返回nil,也就是提交失败了,要解决这个问题,我们需要先取消其该money的监听,并对其进行重新监听,进行其他操作;若提交期间还是有用户进行了修改,解决方案还是先取消,再重新监听;

【JAVAweb~redis】_第26张图片

Redis持久化

RDB(Redis DataBase)

RDB名词解释:
在指定时间间隔内会将内存中的所有数据写入磁盘中,它恢复时是将快照文件直接读到内存里。Redis会独自创建一个子进程进行持久化,先将数据写入一个临时文件中,等到持久化过程结束,在将这个临时文件替换上次持久化好的文件。在整个过程中,主进程不进行任何IO操作,这也就确保了极高的性能。若是需要大规模的数据恢复,并且对于数据恢复的完整性并不是很敏感,那RDB方式比AOF方式更加高效。它的缺点就是最后一次持久化的数据可能会丢失。默认使用的就是RDB,一盘不会修改该配置。
**RDB优点:**适合大规模数据的恢复;对数据的完成性要不高;
RDB缺点需要一定时间间隔进行操作,若是redis意外宕机了,最后一次修改的数据就丢失了。fork进程时会占用一定的空间;

AOF(Append Only File)

将所有命令记录下来,例如history,恢复时将这个文件执行一遍;
以日志的形式来记录每个操作,将redis执行过的所有指令记录下来(不包含读操作),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换句话说,redis重启的话就根据日志文件的内容将写的执行从前到后执行一次以完成数据的恢复工作

Aof保存的是appendonly.aof文件。

默认不开启,手动开启;将appendonly值no改为 yes;
重启redis,就可以生效了。aof文件有错误,redis是不能启动起来的,也就不能连接到redis;使用redis-check-aof --fix appendonly.aof进行修复;

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

Redis发布订阅

Redis发布订阅是一种消息通信模式:发送者发送消息,订阅者接收消息;Redis客户端可以订阅任意数据量的频道。
命令
PSUBSCRIBE pattern[pattern …]订阅一个或者多个给定模式的频道;
PUBLISH channel message 将指定消息发送到指定的频道。
PUNSUBSCRIBE [pattern[pattern…]] 退订所有给定模式的频道;
SUBSCRIBE channel[channel…]订阅给定的一个或者多个频道的信息;
UNSUBSCRIBE[channel[channel…]]只退订给定的频道。
原理

Redis是使用C实现的;它通过PUBLISH、SUBSCRIBE和PSUBSCRIBE等命令实现发布和订阅功能。
通过SUBSCRIBE命令订阅某频道后,redis-server里面维护了一个字典,字典的键就是一个个频道channel,而字典的值则是一个链表,链表中保存了所有订阅这个频道channel的客户端,SUBSCRIBE命令的关键在于,将客户端添加到给定的channel频道的订阅链表中。
通过PUBLISH向订阅者发送消息,redis-server会使用给定频道作为键,在其所维护的频道字典中查找记录了订阅这个频道的所有客户端的链表,然后遍历链表,将消息发送给所有的订阅者。

【JAVAweb~redis】_第27张图片

你可能感兴趣的:(Java,web,redis,redis,nosql,缓存)