NoSQL:即 Not-Only SQL( 泛指非关系型的数据库),作为关系型数据库的补充。
特征:
Nosql 作用:应对基于海量用户和海量数据前提下的数据处理问题。 常见 Nosql 数据库:
概念:Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。
特征:
字符串类型 string 列表类型 list 散列类型 hash 集合类型 set 有序集合类型 sorted_set
docker安装
# 拉取镜像 docker pull redis # 数据卷准备 mkdir -p /mydata/redis/conf touch /mydata/redis/conf/redis.conf echo "appendonly yes" >> /mydata/redis/conf/redis.conf # 启动 docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data \ -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \ -d redis redis-server /etc/redis/redis.conf # 进入容器内部客户端 docker exec -it redis redis-cli # 自启 docker update redis --restart=always
# 添加, 再此设置同一个key就会覆盖 set key value # 得到 get key # 清屏 clear # 帮助信息 help 命令名 help get help @组名 help @String # 退出 quit exit <ESC>
基本操作
# 1.单指定操作 # 添加/修改操作 set key value # 获取数据 get key # 删除数据 del key # 2.多指令操作 # 添加修改多个数据 mset key1 value1 key2 value2 … # 获取多个数据 mget key1 key2 … # 获取数据字符个数(字符串长度) strlen key、 # 追加信息到原始信息后部(如果原始信息存在就追加,否则新建) append key value
扩展操作
1.设置数值数据增加指定范围的值 # 整数自增,默认为1 incr key # 指定增加值,必须为整数 incrby key increment # 指定增加小数 incrbyfloat key increment 2.设置数值数据减少指定范围的值 decr key decrby key increment 3. 设置数据具有指定的生命周期 # 秒 setex key seconds value # 毫秒 psetex key milliseconds value
注意事项
# 添加/修改数据 hset key field value # 获取数据 hget key field # 获取一个key的所有值 hgetall key # 删除数据 hdel key field1 [field2] # 添加/修改多个数据 hmset key field1 value1 field2 value2 … # 获取多个数据 hmget key field1 field2 … # 获取哈希表中字段的数量 hlen key # 获取哈希表中是否存在指定的字段 hexists key field
# 获取哈希表中所有的字段名或字段值 hkeys key hvals key #值可能重复 # 设置指定字段的数值数据增加指定范围的值 正数负数都行 hincrby key field increment hincrbyfloat key field increment # 存在字段就失败,不存在就添加 hsetnx key field value
# 添加/修改数据 # 左添加 lpush key value1 [value2] …… # 右添加 rpush key value1 [value2] …… # 获取数据 # start stop 是索引,最后一个索引可以是 -1 lrange key start stop lindex key index # 获取长度 llen key # 获取并移除数据 lpop key rpop key
阻塞式获取
# 规定时间内获取并移除数据 blpop key1 [key2] timeout brpop key1 [key2] timeout brpoplpush source destination timeout
业务场景
从中间拿数据?
# 移除指定数据 # count:移除几个 value:移除哪个值 # 比如有多个同样的value,从左删除几个 lrem key count value
Tips 6: redis 应用于具有操作先后顺序的数据控制
# 添加数据sadd key member1 [member2] # 获取全部数据smembers key # 删除数据srem key member1 [member2] # 获取集合数据总量scard key # 判断集合中是否包含指定数据sismember key member
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-euFI3UpU-1627901807481)(E:/%E7%AC%94%E8%AE%B0/%E9%BB%91%E9%A9%ACredis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.assets/image-20210730214126470.png?lastModify=1627730512)]
解决方案
# 随机获取集合中指定数量的数据srandmember key [count] # 随机获取集合中的某个数据并将该数据移出集合 spop key [count]
解决方案
求两个集合的交、并、差集
# 交集 A∩Bsinter key1 [key2]# 并集 A∪Bsunion key1 [key2]# 差集 A-B A里面有B里面没有sdiff key1 [key2]
求两个集合的交、并、差集并存储到指定集合中
# destination是一个存储的目的集合的keysinterstore destination key1 [key2]sunionstore destination key1 [key2]sdiffstore destination key1 [key2]
将指定数据从原始集合中移动到目标集合中
smove source destination member
score不用来存储数据
# 添加数据zadd key score1 member1 [score2 member2]# 获取全部数据,可以选择是否带scorezrange key start stop [WITHSCORES] # 升序zrevrange key start stop [WITHSCORES] #降序操作# 删除数据zrem key member [member ...]
# 按条件获取数据 limit限制数量zrangebyscore key min max [WITHSCORES] [LIMIT]zrevrangebyscore key max min [WITHSCORES]# 条件删除数据zremrangebyrank key start stopzremrangebyscore key min max
# 获取集合数据总量# 获得总数zcard key# 根据score的范围查zcount key min max
# 集合交、并操作# 交集的score求和zinterstore destination numkeys key [key ...]# 并集的score求和zunionstore destination numkeys key [key ...]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-faSWV9gL-1627901807485)(E:\笔记\黑马redis学习笔记.assets\image-20210731185855806.png)]
# 获取数据对应的索引(排名) zrank key memberzrevrank key member #降序 # score值获取与修改 zscore key memberzincrby key increment member #修改score
这样无法保证原子性操作,得到的与删除的不是同一个
简单说就是保证score的长度相同
利用数据值上限的规则来判断,一分钟后,再重新设置
# 删除指定key del key # 获取key是否存在 exists key # 获取key的类型 type key
# 为指定key设置有效期 expire key seconds pexpire key milliseconds expireat key timestamp pexpireat key milliseconds-timestamp
# 获取key的有效时间 ttl key # 返回三个值:剩余时间,(-2)不存在,(-1)未设置有效期 pttl key # 切换key从时效性转换为永久性 persist key
keys pattern
# 为key改名 rename key newkey # 改成一个存在的名字会覆盖掉哪个存在的 renamenx key newkey # 不会覆盖 # 对所有key排序,只是排顺序,没有对元数据操作 sort # 其他key通用操作 help @generic
db基本操作
# 切换数据库 select index # 其他操作 # 退出 quit # cli和服务器是否连通 ping # 输出日志 echo message # 有多少个key dbsize
# 数据移动 move key db # 数据清除(危险) # 删除本地的信息 flushdb # 删除所有数据库的信息 flushall
helloworld
public void testJedis(){ // 1.连接redis Jedis jedis = new Jedis("192.168.10.188", 6379); // 2.操作redis jedis.set("name","ls"); String name = jedis.get("name"); System.out.println(name); // 3.关闭redis jedis.close(); }
其他操作与shell命令一样
redis数据是在内存中的,可能会断电数据丢失,就需要将数据存到硬盘上
保存的方式:
RDB(快照):定时将数据持久化到硬盘中
AOP(日志):保存操作的过程
命令
save
作用:手动执行一次保存操作
保存在一个.rdb的文件中
save指令相关配置(添加到配置文件中)
dbfilename dump.rdb
说明:设置本地数据库文件名,默认值为 dump.rdb
经验:通常设置为dump-端口号.rdb
dir
说明:设置存储.rdb文件的路径
经验:通常设置成存储空间较大的目录中,目录名称data
rdbcompression yes
说明:设置存储至本地数据库时是否压缩数据,默认为 yes,采用 LZF 压缩
经验:通常默认为开启状态,如果设置为no,可以节省 CPU 运行时间,但会使存储的文件变大(巨大)
rdbchecksum yes
说明:设置是否进行RDB文件格式校验,该校验过程在写文件和读文件过程均进行
经验:通常默认为开启状态,如果设置为no,可以节约读写性过程约10%时间消耗,但是存储一定的数据损坏风险
# 指定端口号 port 6379 # 指定文件名 dbfilename dump-6379.rdb # 指定文件路径 dir /data # 压缩 rdbcompression yes # 检查 rdbchecksum yes
save指令工作原理
如何解决 ?
后台执行
命令
# 后台执行保存操作 bgsave
作用
手动启动后台保存操作,但不是立即执行
bgsave执行原理
在配置文件配置就会自动进行保存
save second changes
原理
save配置就是bgsave
配置
appendonly yes|no
作用
是否开启AOF持久化功能,默认为不开启状态
配置
appendfsync always|everysec|no
作用
AOF写数据策略
配置
appendfilename xx.aof
作用
指定生成的文件名
只有最后一个命令才会形成最终的数据,造成冗余
# 手动重写 bgrewriteaof # 自动重写 auto-aof-rewrite-min-size size auto-aof-rewrite-percentage percentage