JAVA-第十一部分-Redis-基础操作

375 阅读8分钟

写在前面

NoSQL

  • Not-Only SQL,泛指非关系型的数据库,作为关系型数据库的补充
  • 解决海量用户和高并发的问题

解决方案

  • 商品基本信息 Mysql
  • 商品附加信息 MongoDB
  • 商品图片信息 分布式文件系统
  • 搜索关键字 ES、Lucene、solr
  • 热点信息(高频、波段性) redis、memcache、tair image.png

Redis

  • mac安装 brew install redis
  • 可视化工具 Another Redis Desktop Manager
  • 提供基础数据,减少业务与数据的耦合度
  • Remote Dictionary Server,键值对数据库
  • 单线程机制,数据间没有必然的关联
  • 数据类型 string、list、hash、set、sorted_set(有序集合)
  • 持久化,数据灾难恢复
  • 数值最大范围 +-的long最大值
  • key命名
表名:主键:主键值:属性名,如user:id:3123:fans
//json格式
表名:主键:主键值 -> {属性一:值,属性二:值,属性三:值...}

应用

  • 热点数据查询
  • 任务队列,秒杀、抢购、购票
  • 即时信息、时效信息控制
  • 分布式数据

启动

  • 客户端 redis-cli 退出quit 关闭服务端SHUTDOWN
  • 服务端 redis-server

基本操作

  • 清屏 clear
  • 帮助信息 help
  • 获取当前时间 time

数据类型

  • key永远是String

string

  • 存储单个数据
  • 整体性,一次性存一次性读,强调读
  • 添加 set key value
  • 获取 get key
  • 删除 del key ...
  • 添加多个数据 mset k1 v1 k2 v2 ...
  • 获取多个数据 mget k1 k2
  • 字符个数 strlen key
  • 追加 append key value 不存在则新建
  • 不存在设置 setnx key value

扩展操作

  • String中是数值,可以作为数值数据操作
incr num // +1
decr num // -1
incrby num increment // +increment
incrbyfloat num increment //增加小数
decrby num increment // -increment
  • 设置数据指定的生命周期,周期内可以进行加减操作
//设置秒 过了100秒数据不在
setex key seconds value
setex tel 100 10
//设置毫秒
psetex key milliseconds value

hash

image.png

  • map里放map,购物车、订单信息等
  • key对应的是一堆数据,而这堆数据的空间为hash,底层为hash表(红黑树+数组)
  • 添加
hset key field value
hset user name zhangsan
  • 添加多个
hmset key f1 v1 f2 v2...
hmset user name zhangsan weight 180
  • 获取
hget key field
hget user name
  • 获取多个
hmget k f1 f2..
hmget user name age weight
  • 获取全部
hgetall key
hgetall user
  • 删除
hdel key
hdel user name
  • 获取字段数量
hlen key
  • 是否存在指定字段
hexists key field

扩展操作

  • 获取指定key所有的field
hkeys key
hkeys user
  • 获取指定key所有的value
hvals key
hvals user
  • 增加数值,没有deincrby
hincrby key field increment
hincrby user age 1
//小数
hincrbyfloat key field increment
hincrbyfloat user age 19.2
  • 判断字段是否有值,有值则不修改,没有则新增
hsetnx key field value

list

image.png image.png

  • 时间特定;新增关注,时事新闻等
  • 存储多个数据,并对数据进入存储空间的顺序进行区分
  • 底层是双向链表
  • 添加数据
//从左向右,左边是开口,往右推 value1最右边 最后一个数据索引为1
lpush key value1 value2 ...
//从右向左,右边是开口,往左推 value1 最左边
rpush key value1 value2 ...
  • 获取数据
//从最左边开始获取数据
lrange key start stop
//查询到倒数第一个
lrange key 0 -1
//按数组索引取值
lindex key index
//查询倒数第一个
lindex key -1
//list长度
llen key
  • 获取并移除数据
//从最左边取出数据
lpop key
//从最右边取出数据
rpop key

扩展操作

  • 规定时间获取并移除数据,只要规定时间内能拿到数据就可以
blpop key seconds
brpop key seconds
  • 移除指定元素,移除中间元素
lrem key count value
//从name中移除两个wangwu
lrem name 2 wangwu

Set

image.png

  • 随机推荐热点信息,推荐类信息检索;同类型的数组去重,记录访问ip;黑白名单
  • 底层是hashmap,只使用key的位置存值,不允许重复
  • 不保证插入顺序
  • 便于查找
  • 添加数据
sadd key member1 member2...
  • 获取全部数据
smembers key
  • 删除数据
srem key member1 member2...
  • 获取集合数量
scard key
  • 判断集合中是否包含指定数据
sismember key member

扩展操作

  • 随机获取集合中的指定数量的数据,原集合数据不变
srandmember key [count]
  • 随机获取集合中的某个数据,并移除集合
spop key [count]
  • 两个集合的操作
//交集
sinter key1 [key2]
//存储到destination新集合中
sintersrote destination key1 [key2]
//并集
sunion key1 [key2]
sunionstore destination key1 [key2]
//差集 key2没有key1的部分
sdiff key1 [key2]
sdiffstore destination key1 [key2]
  • 将指定数据从原始集合中移动到目标集合中
//sourc数据来源集合,destination目标集合
smove source destination member

sorted_set

image.png

  • 股票涨势;一年工资;榜单数据;记录任务权重,由数字标记,每个类别长度要一样,如员工102和经理101,不能简单的为1或者2,要灵活补0
  • 根据自身特征进行排序
  • 不允许重复,会按照字符顺序排列
  • 在set的存储结构上添加可排序字段
  • score是一个双精度double值,如果加入的不是数值
ERR value is not a valid float
  • 添加数据
//score为被排序的内容,会根据这个字段进行排序
//member才是真正的值
zadd key score1 member1 score2 member2...
//zs 94分 ls 100分
zadd scores 94 zs 100 ls
  • 获取全部数据
//升序展示 有withscores会展示排序的字段内容
zrange key start stop [withscores]
//查看全部
zrange key 0 -1
//降序
zrevrange key start stop
  • 删除数据
zrem key member ...
  • 按条件获取数据
//升序
zrangebyscore key min max [withscores] [limit]
//查询50-80 之间的数据,按升序,显示分数,只显示前三个
zrangebyscore scores 50 80 withscores limit 0 3
//降序
zrevrangebyscore key max main [withscores] [limit]
  • 条件删除数据
//按索引
zremrangebyrank key start stop
//按照排名 升序 删除三个 0-2索引
zremrangebyrank scores 0 2
//按数值
zremrangebyscore key min max
//删除50-90之间的
zremrangebyscore scores 50 90
  • 获取集合数据总量
zcard key
zcount key min max
  • 集合操作
//numkeys 后面的集合数量
zinterstore destination numkeys key1 key2
//三个集合中求交集,并且相同的数据默认相加
zinterstore ss 3 s1 s2 s3
//三个集合中求交集,并且相同的数据求最小值
zinterstore sss 3 s1 s2 s3 aggregate min
//weights 权重 进行倍数后,再进行计算
zinterstore sss 3 s1 s2 s3 weights 2 3 4
//并集
zunionstore destination numkeys key1 key2

扩展操作

  • 获取数据对应的索引
//升序
zrank key mmeber
//降序
zrevrank key member
  • scare值获取与修改
zscore key member
zincrby key increment member

案例

  • 遇到需要检测次数的情况,例如只有十次机会,利用最大值-10,再通过incr增加,超过最大值报错的特点,进行自动判断
  • 微信会话顺序管理,利用set的不重复的特点存储置顶内容,两个list(栈形式,一端操作)分别存储普通和指定的消息队列进行排队 image.png
  • tips1 2 3 string
  • tips4 5 hash
  • tips5 6 list
  • tips8 9 10 11 12 set
  • tips 13 14 15 sorted_set

高级数据类型

Bitmaps

  • 操作二进制
  • 获取指定key对应偏移量上的bit值 getbit key offset
  • 设置 setbit key offset value value 只能是1或者0
  • 通过数量 bitcount key [start end]
  • 交、并、非、异或
//and or not xor
bitop op(操作) destkey(保存在这里) key1 [key2...]

HyperLogLog

  • 统计不重复的数量,基数(去重后的个数)统计
  • 存储的不是真实数据,只记录数量,核心是基数估算算法,最终数值存在误差(0.81%)
  • 每个使用12k上限的内存,会随着基数的增加内存逐渐增大,直到12k
  • 添加数据 pfadd key element [element ...]
  • 统计数据 pfcount key [key ...]
  • 合并统计 pfmerge destkey sourcekey [sourcekey ...],默认就是12k

GEO

  • 处理地理位置,只算水平位置
  • 添加坐标点 geoadd key longitude(经度) latitude member [....]
  • 获取坐标点 geopos key member [member ...]
  • 计算坐标点距离 geodist key member1 member2 [unit(单位默认是m,可以改成km)]
  • 根据坐标求范围内的数据 georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key] 以这个点为圆心,radius为半径画圆
  • 根据点求范围内的数据 georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key] 以这个成员为圆心,radius为半径画圆
  • 获取指定点对应坐标的hash值 geohash key member [member ...]

通用命令

key

  • 就是一个字符串
  • 删除指定key
del key
  • 获取key的类型
type key
  • 获取key是否存在
exists key

扩展操作

  • 为key设置有效期
expire key seconds
pexpire key milliseconds
//时间戳
expireat key timestamp
pexpireat key milliseconds-timestamp
  • 获取key的有效时间
//返回-1永久,返回-2过期,不存在
ttl key
//毫秒
pttl key
  • 切换key从有效性转换为永久性
persist key
  • 查询key
keys pattern
//查询所有key
keys *
? 匹配一个字符
[] 匹配一个指定字符

image.png

其他操作

  • 改名,newkey同名,则覆盖原来的内容
rename key newkey
//存在则不改
renamenx key newkey
  • 对key的内容排序
//只能操作list或者set,不会改变原集合的顺序
sort key
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
  • 帮助
help @generic

数据库通用指令

  • 切换数据库
//默认16个 0-15
select index
  • 其他操作
quit
//测试服务器,连通的话返回PONG
ping
//客户端输出日志
echo message
  • 移动数据库
move key db
//把name移到0
move name 0
  • 数据清除
//查看有多少个key
dbsize
//删除当前库的数据
flushdb
//删除所有
flushall

发布与订阅

//订阅name的频道
subscribe name
//发布,往name的频道里发value
pulish name value