五大数据类型

官网文档

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库缓存消息中间件MQ。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

String

大多数java程序员使用的是String

  1. 常用命令
# group 1:增加,求长 append strlen
set name qd                 # set [key] [value]
append name 123             # append [key] [append_value] 追加字符串
strlen name                 # strlen [key] 判断key的字符串长度
append name2 zhangsan       # append [key] [value] 如果没有当前key,就相当于set name2 zhangsan# group 2: 自增 自减 按照步长自增 按照步长自减 incr decr incrby decrby
set views 0                 # set [key] [value]设置浏览量为0
incr views                  # incr [key] 给浏览量加一==》 1
decr views                  # decr [key] 给浏览量减一==》0,之后就不可以在自减了,会报error
incrby views 10             # incrby [key] [step] 自增步长:10
decrby views 10             # decrby [key] [step] 自减步长:10# group 3:字符串范围 getrange [startIndex] [endIndex] 一般情况下,两者都大于0,且endIndex>startIndex
getrange name 0 3           # getrange [key] [startIndex] [endIndex] 按照范围取字符串:index的值从0开始,会从star取到end 若按照正常的数值,取到的字符串长度为end-star+1
getrange name 0 -1          #getrange [key] [startIndex] -1 从starIndex取到最后#group 4:替换指定位置开始的字符串 setrange (相当于String中的replace)
setrange name 2 sub             # setrange [key] [startIndex] [subString] 使用subString替代从statIndex开始的之后和subString相同长度的字符串;返回的为替代之后的长度
get name # 得到的为 lisubolu
# 示例2
setrange name 7 sub2
get name                        # 得到的为lisubolsub2# group 5: setex(作用同expire) setnx
#setex (set with expire)  设置过期时间
#setnex (set if not exit)  不存在则设置(在分布式锁常常使用)
setex name 30 "hello"         # setex [key] [expireTime] [value] 设置key存活时长为expireTime,设置值为value (若key不存在则创建)
setnx key1  "qd"          # setnx [key] [value] 当key不存在的时候设置值为value;存在会创建失败:(设置成功会返回1,设置失败会返回0)# group 6:批量设置mset mget  msetex msetnx
mset k1 v1 k2 v2 k3 v3          # 批量设置(k1,v1),(k2,v2),(k3,v3)  mset [key1] [value1] [key2] [value2] [key3] [value3] ...  存储的顺序是哈希算法设置的
mget k1 k2                      # 批量获取 k1 k2...  mget [key1] [key2] ...
msetnx k1 v1 k4 v4              # msetnx是一个原子性操作,要么一起成功,要么一起失败
# 进阶 使用对象
set user:1 {name:zhangsan,age:3}        # 设置一个user:1对象 值为json字符串来保存一个对象
# 如何获取到单独的属性值????
mset user:1:name name1 user:1:age 2     # 批量设置对象属性 [object]:[id]:[field]
mget user:1:name user:1:age             # 批量获取数据# group 7:getset 先get再set
getset db redis                         # 返回(nil) 获取的是db之前的值,如果之前没有设置,则返回(nil),之后获取的值为当前设置的值(redis)
get db                                  # 本次返回的redis
  1. String类似的场景:value除了是字符串也可以是数字
  2. 应用:计数器 统计多单位的数量 粉丝数 对象缓存存储
  3. 扩展:CAS:比较并交换
    JRedis:java操作的客户端,这些命令都会成为方法
    结构是相同的

List

  1. 基本的数据类型
  2. 在redis中,可以将list玩成栈、队列、阻塞队列
  3. 大部分list命令都是由l开头:除了lpush和rpush表示左右,其他的l都表示list
  4. 基础命令
# group 1 插入 lpush rpush
lpush list one                  # 将一个值或者多个值,插入到列表头部(从左端插入:头插)
lpush list two
lpush list three
lrange list 0 -1                # 获取list中的值:输出为 three two one (没有rrange)
lrange list 0 1                 # 通过区间获取具体的值
rpush list four                 # 将一个值或者多个值,插入到列表尾部(从右端插入:尾插)
lrange list 0 -1                # 得到的结果为:three two one four# group 2 移除lpop rpop
lpop list                       # 向左移除一个元素,返回的是元素内容:three
rpop list                       # 向右移除一个元素,返回的是元素内容:four# group 3 按照索引取值
lindex list 0                   # 索引从0开始,-1代表取最后一个元素 没有rindex# group 4 获取列表长度 llen
llen list                       # 返回列表长度# group 5 移除指定值 count>0 移除count个(从前往后) count=0 移除所有 count<0移除count个(从后往前)
lrem list 0 one                 # 移除list中所有的one
lrem list 1 one                 # 移除list中的一个one# group 6 截断操作
lpush list2 one two three four  # 新的list:list2[one,two,three,four]
ltrim list2 1 2                 # 截断:截断的时候两个参数是index(从0开始),会改变list# group 7 rpoplpush:移出列表的最后一个元素,并将它放到一个新list中 旧的list可以和新的list是同一个
lpush list3 one two three four  # 新的list:list3[one,two,three,four]
rpoplpush list3 list4           # "one"
lrange list3 0 -1               # 得到的结果为: four three two
lrange list4 0 -1               # 得到的结果为:one# group 8 lset 给一个已经存在的list修改已经存在的index的值:相当于更新操作
lpush list5 one two three four  # 新的list:list5[one,two,three,four]
exists list5                    # 判断是否存在,返回0(不存在)或 1(存在)
lset list5 0 item               # 将list5中的第0个元素设置为“item”,注意index的位置  # group 9 linsert 将某个具体的value插入到列表中某个元素的前面或后面
lpush list6 one one three four  # 新的list:list6[one,one,three,four]
linsert list6 before one qd     # 将qd插入到one前面:list6[qd,one,one,three,four]
linsert list6 after one qd2     # 将qd2插入到one后面:list6[qd,one,qd2,one,three,four]
# 如果有重复,会按照第一个为标准

小结:

  1. 实际上是一个链表,before node after,left,right都可以插入值
  2. 如果key不存在,则创建新的链表
  3. 如果key存在新增内容
  4. 如果移除了所有值,即空链表,也代表不存在
  5. 当在两边插入或者改动值的时候,效率最高;操作中间元素的时候相对效率会低一些
  1. 应用:消息排队,消息队列(lpush,rpop),栈(lpush,lpop)

Set 集合

  1. 无序不能重复值
  2. 基础命令
sadd set0 "one" "two" "three" "four"     # set0集合中添加元素
smembers set0                               # 查看set0的值
sismember set0 one                          # 判断set0中是否存在 one 元素
scard set0                                  #查看set0的元素个数
srem set0 one                               # 移除set0中的指定元素
srandmember set0                            # 随机从set0中取元素,默认为取一个
srandmember set0 2                          # 随机从set0中取两个元素
spop set0                                   # 随机移除set0中的一个元素;返回值为移除的值
spop set0 2                                 # 随机移除set0中的两个元素;返回值为移除的值sadd set1 "hello" "123" "qd"              # 创建set1
sadd set2 "hello2" "1232" "qd2"               # 创建set2
smove set1 set2 "hello"                       # 将set1中的"hello" 移动到set2# 差集sdiff 交集sunion 并集sinter
sadd key1 a b c                             # 创建key1
sadd key2 b c d                             # 创建key2
sdiff key1 key2                             # 求key1与key2的差集
sinter key1 key2                            # 求key1与key2的交集
sunion key1 key2                            # 求key1与key2的并集
  1. 应用:微博,A用户将所有关注放在一个set中,将其粉丝放在一个集合中:可以求和其他用户的共同关注,共同爱好,二度好友(六度分割理论),推荐好友(六度分割理论)

Hash(哈希)

  1. 想成一个Map集合:key-value(map):此处的value是map的类型
  2. 基础命令
# group 1
hset myhash field1 lxl                  # 创建一个hash:myhash
hmset myhash field1 lxl field2 qd       # 可以一次赋值多个(也可以用hset操作)
hget myhash field1                      # 获取一个field的值
hmget myhash field1 field2              # 获取多个field的值
hgetall myhash                          # 获取全部的数据# group 2
hdel myhash field1                      # 删除hash指定的field,也会删除对应的value
hlen myhash                             # 查看hash中有多少对键值对
hexists myhash field1                   # 判断hash中是否有对应的field 返回1或者0# group 3 只获取key 只获取value
hkeys myhash                            # 获取所有的field
hvals myhash                            # 获取所有的value# group 4 hincrby hsetnx
hset myhash field3 5                    # 给myhash设置一个field3 值为5
hincrby myhash field3 2                 # 使得myhash中的field3自增2(不可以省略步长)
hincrby myhash field3 -2                # 使得myhash中的field3自减2(不可以省略步长,没有hdecrby方法)
hsetnx myhash field4 hello              # 如果不存在,则创建,存在则创建失败
  1. 应用:

    • hash存储一些变更的数据: name age …,尤其是用户信息之类的经常变动的信息
    • hash更实用于对象的存储,String更适合字符串存储
hset user:1 name qd age 20               # 设置id为1的用户的name age
hget user:1 name                        # 获取user:1的name
hmset user:1 name age                   # 获取user:1的name age

Zset(有序集合)

  1. 在set的基础上增加了一个值:set k1 v1 zset k1 score1 v1
  2. 有序集合底层数据结构是跳跃链表(常见面试考点)
  3. 基础命令
# score是可以重复的,元素值不重复
zadd myset 1 one                        # 创建zset 添加一个值
zadd myset 2 two 3 three                # 一次添加多个值# group 2 排序
zadd salary 2500 xiaohong
zadd salary 5000 zhangsan
zadd salary 500 qd
zrangebyscore salary -inf +inf         # 显示所有用户,从小到大排序范围:[-inf,+inf] (前者<后者,不能相等),返回的值只有元素值,不带着score
# 使用zrevrangebyscore 可以实现从大到小排列,这时候传的值需要前者大于后者,同样不可以相等
zrangebyscore salary 500 5500
zrangebyscore salary -inf +inf withscores  # 带着score# 移除
zrem salary xiaohong                    # 移除一个元素 xiaohong,同时移除score# 获取指定区间的成员数量
zcard salary                            # 获取有序集合元素中的个数
zcount salary 500 5500                  # 统计薪资在[500,5500]的人数
  1. 应用:

    • set排序 存储班级成绩表 工资表排序 排行榜
    • 带权重进行判断

【狂神说Redis】3五大数据类型相关推荐

  1. NoSQL(1)之 Redis的五大数据类型使用方法的详细介绍

    Redis的五大数据类型也称五大数据对象:了解过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject:这个对象系统包含了五大数据对 ...

  2. redis之五大数据类型

    redis之五大数据类型 redis redis的两种链接方式 简单链接 1234 import redisconn = redis.Redis(host='10.0.0.200',port=6379 ...

  3. redis的zset的底层实现_Redis(三)--- Redis的五大数据类型的底层实现

    1.简介 Redis的五大数据类型也称五大数据对象:前面介绍过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject:这个对象系统包 ...

  4. 解析Redis操作五大数据类型常用命令

    摘要:分享经常用到一些命令和使用场景总结,以及对Redis中五大数据类型如何使用cmd命令行的形式进行操作的方法. 本文分享自华为云社区<Redis操作五大数据类型常用命令解析>,作者:灰 ...

  5. 配置文件存int类型_Redis详解(五)------ redis的五大数据类型实现原理

    > 本系列教程持续更新,可以微信搜索「 IT可乐 」第一时间阅读.回复<电子书>有我为大家特别筛选的书籍资料 前面两篇博客,第一篇介绍了五大数据类型的基本用法,第二篇介绍了Redis ...

  6. Redis常用五大数据类型

    1.String(字符串) string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象 . string类型是Redis最基本的数据类型,一个red ...

  7. Redis的五大数据类型

    1.String(字符串) String是Redis最基本的类型,一个Key对应一个Value. String类型是二进制安全的,意思是Redis的String可以包含任何数据,比如jpg图片或者序列 ...

  8. 学习了Redis的五大数据类型,其底层实现你了解吗?

    文章目录 String底层 List底层 Hash底层 Set底层 Zset底层 String底层 String的底层并不是简单的C字符串简单动态字符串(Simple Dynamic String,S ...

  9. redis srandmember_Redis五大数据类型使用场景

    Redis是一种基于键值对的NoSQL数据库,它的值主要由string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合)五种基本数据结构构成,除此之外还支持一些其他的 ...

  10. 【Redis】Redis的五大数据类型

    文章目录 字符串(strings) 散列(hashes) 列表(lists) 集合(sets) 有序集合(sorted sets) 字符串(strings) 开启redis服务并连接 [root@lo ...

最新文章

  1. 手动部署OpenStack环境(六:出现的问题与解决方案总结)
  2. 二叉排序树经典算法速成
  3. sklearn自学指南(part10)--Lasso及多任务Lasso
  4. 查看 固态硬盘位置_3米防摔+人脸/指纹解锁:西数Armorlock移动固态硬盘
  5. C++ 版本ORM访问数据库之ODB访问oracle的Demo(三)
  6. C#统计字符出现个数
  7. C++字符串空格替换题
  8. JSP + AjaxAnywhere页面开发规范
  9. SYNwall:零配置物联网防火墙
  10. 匹配 网络 Q值 带宽
  11. 基金定投matlab程序,销售基金定投好简单:如何三分钟让客户理智开户做定投
  12. MATLAB 詹姆斯韦伯天文望远镜轨迹 粗略效果仿真 (二)
  13. k3显示远程服务器未打开,k3客户端远程服务器链接
  14. E-CATT 录入测试数据的方法
  15. Logo(图片)作为报表水印的解决方法
  16. mysql 聚集索引 存什么_什么是mysql的聚集索引?
  17. 初次结识海蜘蛛(2)
  18. Java实现第九届蓝桥杯小朋友崇拜圈
  19. 制作epub格式电子书|用电脑看epub格式电子书的方法!
  20. Vue中 实现文件流格式图片预览

热门文章

  1. 基金境外设立子公司将迎新规 监管给出24个月过渡期
  2. 踩着七彩祥云来接你的人不一定是意中人,也可能是阿里云
  3. ZStack实践汇 | 快照和备份的区别
  4. 王庆的边缘计算(第三章)
  5. 【优化算法】蛙跳算法 (SFLA)【含Matlab源码 1839期】
  6. mysql悲观锁替代方案_MySQL中的悲观锁和乐观锁
  7. 苹果系统和安卓系统的区别_Android和iPhone的区别?还不如说安卓系统和IOS系统的差别...
  8. ai人工智能_AI破坏已经开始
  9. 计算机专业答辩网站怎么保证安全性,答辩(计算机专业答辩题目选集)
  10. 考上985能改变命运吗_南开研究生称读研改变命运被嘲讽,网友:本科垃圾,考上985也没用...