redis应用【二】 -- redis的几种数据结构

概念

redis数据库是一个 用C语言开发的高性能键值对数据库,支持多种键值对的存储类型。
根据官网的描述,redis的读写性能是相当之高的。
读性能:每秒11万次
写性能:每秒8万次
redis的所有存储方式都是以key-value的形式存储的,按照不同的场景需求,redis的value支持多种数据结构
包括以下5种:
  • 字符串
  • 哈希
  • 字符串列表
  • 字符串集合
  • 有序字符串集合
针对以上不同的数据结构,可以应用于不同的场景需求。
目前对redis的应用主要有以下这些场景:
  1. 缓存,字典数据,新闻,在线聊天室,好友列表
  2. 任务队列,秒杀,抢购
  3. 应用排行榜
  4. 网站访问统计
  5. 数据过期的处理
  6. 分布式集群架构的session的分离

字符串

操作类型:赋值,取值,更新值,删值,数值增减,字符串追加
  • 赋值
  • 命令 : set key value
  • 取值
  • 命令:get key 
  • 更新值
  • 命令 getset key newvalue  
  • 删除
  • 命令 del key
  • 增减值
  • 命令 -- 自动累加1  incr key
  • 命令-- 自动减1    decr key
  • 命令 -- 设定增长值  incrby key 5
  • 命令-- 设定减少值  decrby key 5
  • 追加 -- 给已有的key的value字符串后面追加字符,如果key不存在则以空字符串追加
  • 命令-- append key appendvalue

哈希

哈希顾名思义,相当于java的集合对象Map
操作类型有:赋值,取值,删除,判断是否存在,获取哈希的长度,获取哈希的所有key,获取哈希的所有value
  • 赋值 hset命令
  • 命令:hset person name jack     --意思是创建一个key为person的哈希【当person存在则不用创建】,其哈希里边有一对键值对,key为name,value为jack 
  • 同时给哈希赋值多个key
  • 命令: hset person name jack age 18 --意思是给person这个hash赋予两个key ,分别为 name:jack , age:18
  • 取值 hget命令
  • 命令:hget person name 
  • 获取多个值
  • 命令:hget person name age
  • 获取整个哈希对象 hgetall 命令
  • 命令: hgetall person
  • 删除 hdel
  • 删除哈希里的某个key
  • hdel person name --删除person这个哈希的 name属性
  • 删除整个哈希 del[跟删除字符串用的是同个命令]
  • del person
  • 判断哈希里是否存在某个值
  • hexists person name --判断哈希person里是否有name这个key,如果有则返回1 ,没有则返回0
  • 获取哈希的长度 hlen
  • 命令 hlen person   返回2
  • 获取哈希的所有key  hkeys
  • 命令:hkeys person  返回  name age
  • 获取哈希的所有value hvals
  • 命令:hvals person     返回 jack 18

字符串列表

字符串列表相当于java里的 LinkedList<String>对象,数据存进去后是有先后顺序的,它支持从左往右,从右往左各种方式索引数据。常用场景有用来做消息队列。
  • 存值
  • 命令:lpush  rpush [l:left  r:right]
  • lpush mylist a b c d e  -- 表示往 列表mylist 里从左边依次塞入值 a b c d e, lpush相当于是压栈操作,在mylist里边的数据顺序是e d c b a
  • rpush mylist2 1 2 3 4 5 -- 表示往 列表mylist2 里从右边依次塞入值 1 2 3 4 5, rpush相当于是压栈操作,在mylist2里边的数据顺序是 1 2 3 4 5
  • 取值
  • 命令:lrange 
  • lrange mylist 0 3  代表获取下标 0 到3 的所有元素,返回 e d c b
  • lrange mylist 0 -1 获取整个列表
  • lrange mylist 0 -2 获取下标为0 到 倒数第二个
  • 出栈操作:lpop rpop  lpop从左边弹出一个元素,rpop从右边弹出一个元素,弹出后,列表里将减少了一个弹出的那个元素
  • lpop mylist -- 从mylist的左边弹出一个元素,return e
  • lpushx 往数组的左边插入值,只插入一个值
  • 命令:lpushx mylist x 
  • 删除值,可以使用命令 lrem
  • lrem mylist n val 代表从左边删除数组里边的数据,从左边数起删除n个值为val的值
  • lrem mylist 3 a ,代表从左边往右边数,删除3个a
  • lrem mylist -2 b 前面的-负数代表从右边数起,删除2个b
  • lrem mylist 0 c 代表删除数组中所有c的对象
  • 更新值
  • lset 往数组的某个位置赋予新的值
  • lset mylist 3 d 代表将原先下标为3的值改为d
  • 插入值linsert
  • 如果mylist的数组为 1 2 3 4 5 
  • 想要在3前面插入值为a,则需要使用命令 linsert mylist before 3 a
  • 想要在3后面插入值为b,则需要使用命令 linsert mylist after 3 b

集合

集合里的字符串元素是无序的,相当于java的Set<String>

  • 添加 使用命令 sadd
  • sadd myset a b c 
  • 删除 使用命令srem
  • srem myset a b
  • 取值 smembers sismember
  • 获取当前set集合的所有内容 smembers myset
  • 判断当前集合中是否存在某个值 sismember myset a 存在返回 1 ,不存在返回 0
  • 获取集合总数 使用命令scard
  • scard myset return 3
  • 随机取出一个元素 使用命令srandmember
  • srandmember myset
  • 交集 使用命令 sinter ,可以将两个集合中存在相同的元素找出来
  • 比如 myset1 [1,2,3,4] myset2[1,4,5]
  • 执行命令后 sinter myset1 myset2 最后得出结果 [1,4]
  • 交集结构存放新的地方 使用命令sinterstore
  • sinterstore resultset myset1 myset2
  • 并集 使用命令 sunion ,可以将两个集合的元素合并起来
  • 比如 myset1 [1,2,3,4] myset2[1,4,5]
  • 执行命令后 sunion myset1 myset2 最后得出结果 [1,2,3,4,5]
  • 并集结构存放新的地方 使用命令sunionstore
  • sunionstore resultset myset1 myset2
  • 差集 使用命令 sdiff ,可以找出第一个集合中有的但是第二个集合中不存在的元素
  • 比如 myset1 [1,2,3,4] myset2[1,4,5]
  • 执行命令后 sdiff myset1 myset2 最后得出结果 [2,3]
  • 差集结构存放新的地方 使用命令sdiffstore
  • sdiffstore resultset myset1 myset2

有序集合 sortSet

有序集合其实是set里边的每个元素有权重的概念,搜索数据时可以按照权重排序得到数据
  •        增加元素,可以使用命令 zadd key score item1 score item2 ......
比如 增加一个有序列集合 zadd zset 8 zjc 9 wkq 10 lmy
  • 重新修改某个元素的分数
zadd zset 11 zjc --把zjc的分数改为11
  • 获取元素zjc的分数
zscore zset zjc
  • 获取有序列的元素数量
zcard zset
  • 删除元素
zrem zset zjc
  • 查询有序集合里所有元素
zrange zst 0 -1
  • 查询所有有序集合带上分数
zrange zset 0 -1 withscores
  • 查询所有有序集合,按倒叙输出
zrevrange zset 0 -1
  • 按照范围进行删除集合的数据
zremrangebyrank zset 0 3 -- 代表删除从0到3的元素
  • 按照分数范围进行删除集合中的元素
zremrangebyscore zset 8 10 --代表删除zset集合中分数在 8 到10 的元素
  • 按照分数范围查询数据
zrangebyscore zset 0 10 withscores --查询出分数在0 到10分的所有元素
zrangebyscore zset 0 10 withscores limit 0 2 --查询出分数在0 到10分的所有元素的前两个元素
  • 给某个元素增加分数
zincrby zset 5 zjc --给zjc这个元素增加5分
  • 统计元素的数量 zcount
zcount zset 8 10 --统计zset中分数在8到10之间的元素有多少个






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值