redis数据库
- 默认有16个数据库,redis.conf有配置
database 16
- 数据库相关操作
select 2 # 选择2号数据库
dbsize # 统计已存储的key数
keys *
flushdb # 清除当前数据库
- RedisKeys命令
expire '键' '过期时间s' # 设置过期时间s pexpire是毫秒级
expireat '键' '过期unix时间戳s' # 设置过期时间戳s pexpireat是毫秒级
ttl '键' # 查看还剩多久过期s pttl是毫秒级 -1表示未设置过期时间 -2不存在或已过期
数据类型
- 五大数据类型的命令,针对键操作:string、list、set、hash、zset
- string适合字符串存储,可以用于:计数器、粉丝数、对象缓存存储
- List左进右出(LPUSH RPOP)可以设计成消息队列;先进后出(LPUSH LPOP)可以设计成栈
- set在微博中会有 共同关注sdiff、推荐好友sunion 实现
- hash适合对象存储,可以存储用户信息、经常变动的信息。区别于string
- sorted set有序集合,带权重判断(普通消息 1,重要消息 2)、B站排行榜、获取top3
#### string类型
append
# 原子性 +1
incr/decr
incrby/decrby
# 原子性,且效率更高
mset/mget/msetnx
# 截取出部分字符串
getrange
setex mykey 10 "Hello" # 设置k-v和过期时间秒数
# 分布式锁中使用
setnx mykey "World" #key不存在类似于set命令-1,存在什么也不做-0
#### list类型 【最左边是第一个元素,最右边是最后一个元素】
lpush/rpush mylist value
lrange mylist 0 -1 # 获取所有
rpoplpush mylist myotherlist # 移除最后一个元素放入另一个list,并返回这个值
#### set【无序的、不可重复的】
sadd myset one two three
smembers
sismember
smove
sdiff/sunion # 交集,并集
#### hash 【值存的是k-v的map集合】
hmset myhash user:1 edison name:1 23
hmget myhash user:1 name:1
hgetall myhash
#### zset【在set上加一个比分,具备排序功能】
zadd myzset score member
zadd salary 1000 zhangsan 800 lisi 300 xiaoming
zrangebyscore salary -inf +inf # 按照score从低到高排序,分数相同就按照元素字母排序
zrange salary 0 -1 # 获取集合值元素
-
三种特殊类型命令 geospatial(redis3.2) hyberloglogs(redis2.8) bitmaps
- geo基于有序集合zset, 用于朋友定位georadiusbymember、附近的人(georadius位置数据事先导入,再半径查询)、打车距离计算 经度纬度查询
- hyberloglog数据结构,多个集合的基数统计算法,用于网页UV(set需要保存ID,hybe只是计数)、ip流量统计、用户搜索关键字数量
- bitmaps位存储,string也可实现,统计用户信息(活跃/不活跃,登录/未登录,打卡/未打卡)
#### geo 【存储经度、纬度、名称】 # 1. 两极无法直接添加 # 2. java程序中,会事先下好城市数据,再一次性导入 geoadd china:city 116.40 39.90 beijing 121.44 31.21 shanghai # 插入城市的经度纬度名称 geopos china:city beijing # 查询城市位置,返回两元素数组 geodist china:city beijing shanghai km # 显示两地距离 km georadius china:city 121 31 2000 km withcoord withdist count 2 # 查找方圆2000km的城市 zrange china:city 0 -1 # geo底层是zset(type china:city验证),可以使用zset命令 #### hybeloglog 【基数统计:不重复的元素】 # 1. 占用内存固定且很小,12k 0.81%错误率 pfadd mykey 1 2 3 4 4 4 5 6 # 不重复统计 6 pfadd mykey2 3 4 5 6 7 8 9 pmerge mykey3 mykey mykey2 # 存不重复的并集元素 #### bitmaps【位存储】 # 1. 用户365天的打卡信息 只需要365bit~46K就可以存储 setbit key 1 0 #周一未打卡 getbit key 1 #查看周一打卡信息 bitcount key #统计为1的总数
客户端下的Server命令
config get port #获取配置参数的值
save #主动保存rdb文件,会阻塞客户端操作
info replication #主从复制里的角色
redis事务
redis单条命令保持原子性,但事务不保证原子性 要么全部执行,要么全部不执行
redis事务没有隔离级别概念,不存在关系型数据库的幻读脏读问题
一组redis命令在食物中并没有直接执行,只有发起执行命令exec才会执行
出现运行时异常(语法错误)时,其他依然正确执行,不回滚【事务非原子性】*;编译时异常都不执行(拼写错误)*
-
事务是命令组合(队列),多个redis命令的操作 【redis脚本】
-
redis事务的步骤:
- 开启事务(multi)
- 命令入队 (set get sadd …)
- 取消/放弃事务(discard)
- 执行事务(exec)
-
事务中的Redis监视——乐观锁(redis分布式锁)
- 悲观锁
无论什么操作都加锁,使用才会释放
- 乐观锁
-
任何操作都不会出现问题,所以不会上锁,只是在更新数据的时候去判断数据是否被修改过?
-
CAS并发算法: MySQL每次提交前,会先查出数据版本version;并用version去判断是否有更新,version相同成功才提交
-
Redis事务中使用Watch实现乐观锁,监视key是否有变化,有则当前连接事务里的命令不能提交
watch key multi -...-exec
-
watch 监视键值对,作用是如果事务提交exec时发现监视的监视对发生变化,事务将被取消
-
开两个客户端连接,模拟并发 多路复用
redis事务里的乐观锁: # 1. A连接正在事务操作,还未执行,B连接修改了值,那么A执行就不成功nil # 2. 此时unwatch,再watch money,获取信息再监视 应用场景:电子商城秒杀业务
配置文件
#1.可以引入其他文件
# include .\path\to\local.conf
# include c:\path\to\other.conf
#2.指定主机访问,默认允许本机,所有为*
bind 127.0.0.1
port 6379
#3.通用配置
daemonize yes # 守护进程后台运行
pidfile /var/run/redis_6379.pid # 当后台运行时,需要指定pid进程文件
loglevel notice # 日志级别设置 4种
logfile "" # 日志文件名,默认标准输出
database 16
#4.快照SNAPSHOTTING持久化 .rdb
# save 900 1
# save 300 10
# save 60 10000
save 10 1 # 自定义的每10s内有一次更新就保存rdb
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
#5.主从复制 replication
#6.安全性,默认无密码,config get requirepass
# requirepass foobared
# masterauth xxxx # 主从复制集群里,这个在replicaiotn节里
#7.内存
# maxmemory <bytes>
# maxmemory-policy noeviction # 内存满了的淘汰策略 6种
#8.APPEND ONLY MODE配置 .aof
appendonly no # 默认不开启,大多数情况下rdb就可以了
appendfilename "appendonly.aof"
appendfsync everysec # 每秒都同步aof 3种