Redis增删改查操作

目录

1.redis的数据结构:

2.命令操作:

1.通用命令:

2.String类型:

3.Hash类型:

4.List类型:

5.集合类型 set:

6.有序集合类型 sortedset:

7.位操作Bitmaps:

8.基数统计HyperLog:

9.经纬度GEO:


1.redis的数据结构:

  • redis存储的是:key,value格式的数据,其中key都是字符串,value常用的有8种不同的数据结构

  • value的数据结构:

    基本数据结构 说明
    字符串类型 String String
    哈希类型 Hash map格式
    列表类型 List linkedlist格式。支持重复元素
    集合类型 Set 不允许重复元素
    有序集合类型 SortedSet 不允许重复元素,且元素有顺序
    特殊数据结构 说明
    Geo 存储的地理位置的经纬度
    BitMap 本身不是一种数据类型, 实际上它就是字符串,可以实现对位的操作
    HyperLog Redis HyperLogLog 是用来做基数统计的算法

2.命令操作:

1.通用命令:

格式 说明
select [数据库号] 切换数据库(redis的数据库有16个)
help @[数据类型] 查看相关数据类型的命令
help [commend] 查询相关命令的用法
keys [条件] 查看符合模板的所有key,不建议在生产环境设备上使用
expire [key] [time] 给一个key设置有效期,到期时会被自动删除;创建key时没有设置时间key将永久有效,表示为-1;
ttl [key] 查看一个KEY的剩余有效期
exists [key] 判断key是否存在
set [key] [value] 添加或者修改已经存在的一个String类型的键值对
set [key] [value] ex [time] 组合命令,添加一个的键值对,并且指定有效期(单位秒)
get [key] 获取指定 key 的值
mset [key1] [value1] ... 批量添加多个键值对
mget [key1] [key2] ..... 根据多个key获取多个String类型的value
setnx [key] [value] 添加一个String类型的键值对,前提是这个key不存在,否则不执行
setex [key] [time] [value] 添加一个String类型的键值对,并且指定有效期(单位秒)
del [key1] [key2]..... 删除一个指定的key,或删除多个key
flushdb 当前数据库中的所有Key
flushall 所有数据库中的key
incr [key] 让一个整型的key自增1,返回增加1后的值
incrby [key] [增长数] 让一个整型的key自增并指定步长,返回增加1个步长后的值
decr [key] 将 key 中储存的数字值减一
decr key [增长数] key 所储存的值减去给定的减量值(decrement)
append [key] [value] 如果 key 已经存在并且是一个字符串,将指定的value 追加到该 key 原来值 value 的末尾
  • 查看相关数据类型的命令

    help @hash
  • 查询相关命令的用法

    help keys
  • 查看符合模板的所有key,不建议在生产环境设备上使用

    keys *    # 查询所有的键
    keys a*   # 查询以a开头的键
  • 删除一个指定的key,或删除多个key

    del k1 k2 k3
  • 判断key是否存在

    exists name
  • 给一个key设置有效期,有效期到期时该key会被自动删除;如果创建key时没有设置时间key将永久有效,表示为-1;

    expire name 20   # (单位秒)
  • 查看一个KEY的剩余有效期

    ttl name

2.String类型:

  • String类型,也就是字符串类型,时Redis中最简单的存储类型。

  • 其中value是字符串,不过根据字符串的格式不同,又可以分为3类:

    分类 说明
    string 普通字符串
    int 整形类型,可以做自增,自减操作
    float 浮点类型,可以做自增,自减操作
  • 不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m.

  • 常见命令:

    # 添加或者修改一个String类型的键值对
    set name itcast
    # 添加或者修改一个String类型的键值对(多key结构)
    set heima:user:1 itcast
    # 批量添加多个String类型的键值对
    mset k1 v1 k2 v2 k3 v3  
    # 根据多个key获取多个String类型的value
    mget k1 k2 k3
    # 让一个整型的key自增1
    incr age
    # 让一个整型的key自增并指定步长
    incrby age 2
    # 添加一个String类型的键值对,前提是这个key不存在;如果不存在不执行
    setnx lock 1

3.Hash类型:

  • Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构

  • String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便

  • Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:

  • 常用命令:

    常用命令 说明
    hset [key] [field] [value] 添加或者修改hash类型key的field的值
    hget [key] [field] 获取一个hash类型key的field的值
    hmset [key1] [field1] [value1] [field2] [value2]... 批量添加多个hash类型key的field的值
    hmget [key1] [field1] [field2]..... 批量获取多个hash类型key的field的值
    hgetall [key] 获取一个hash类型的key中的所有的field和value
    hkeys [key] 获取一个hash类型的key中的所有的field
    hvals [key] 获取一个hash类型的key中的所有的value
    hincrby [key] [field] [time] 让一个hash类型key的字段值自增并指定步长,返回增长后的值
    hsetnx [key] [field] [value] 添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
    # 添加或者修改hash类型key的field的值
    hset heima:user:1 name zhangsan 
    hset heima:user:1 age 18
    # 获取一个hash类型key的field的值
    hget heima:user:3 age
    # 获取一个hash类型的key中的所有的field和value
    hgetall heima:user:3
    # 获取一个hash类型的key中的所有的field
    hkeys heima:user:3
    # 让一个hash类型key的字段值自增并指定步长,返回增长后的值
    hincrby heima:user:3 age 2

4.List类型:

  • Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。

  • 特征也与LinkedList类似:

    1. 有序 2.元素可以重复 3.插入和删除快 4.查询速度一般

  • 常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。

  • 常用命令:

    常见命令 说明
    lpush [key] [value2] [value2].... 向列表左侧插入一个或多个元素,返回链表长度
    lpop [key] 移除并返回列表左侧的第一个元素,没有则返回null
    rpush [key] [value2] [value2].... 向列表右侧插入一个或多个元素,返回链表长度
    rpop 移除并返回列表右侧的第一个元素
    lrange [key] [start] [end] 返回一段角标范围内的所有元素,从零开始[ start end )
    blpop [key] [time] 移除并返回列表左侧的第一个元素,只不过在没有元素时等待指定时间(单位秒)
    brpop [key] [time] 移除并返回列表右侧的第一个元素,只不过在没有元素时等待指定时间(单位秒)
    # 向列表左侧插入一个或多个元素(顺序为3-2-1)
    lpush users 1 2 3
    # 向列表右侧插入一个或多个元素(顺序为1-2-3)
    rpush users 1 2 3
    # 移除并返回列表左侧的第一个元素
    lpop users 
    # 返回一段角标范围内的所有元素,[ start end )
    lrange users 0 2
    # 移除并返回列表左侧的第一个元素,只不过在没有元素时等待指定时间(单位秒)
    blpop users 10

5.集合类型 set:

  • Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:

  • 特点:

    1. 无序 2.元素不可重复 3.查找快 4.支持交集、并集、差集等功能

  • 常见命令:

    常见命令 说明
    sadd [key] [value1] [value2].... 向set中添加一个或多个元素
    srem [key] [value] 移除set中的指定元素
    scard [key] 返回set中元素的个数
    sismember [key] [value] 判断一个元素是否存在于set中,如果存在返回1
    smembers [key] 获取set中的所有元素
    sinter [key1] [key2] 求key1与key2的交集,返回相同的元素
    sdiff [key1] [key2] 求key1与key2的差集,返回key1中不相同的元素
    sunion [key1] [key2] 求key1和key2的并集,返回所有的元素(不重复)
    # 向set中添加一个或多个元素
    sadd users a b c d
    # 移除set中的指定元素
    srem users a
    # 返回set中元素的个数
    scard users
    # 判断一个元素是否存在于set中
    sismember users a
    # 获取set中的所有元素
    smembers users
    # 求key1与key2的交集,返回相同的元素
    sinter users products

6.有序集合类型 sortedset:

  • Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表

  • SortedSet具备下列特性:

    1. 可排序 2.元素不重复 3.查询速度快

  • 因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。

  • 注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可

  • 注意:score为相同数据类型

  • 常用命令:

    常用命令 说明
    zadd [key] [score1] [value1] [score2] [value2].... 添加一个或多个元素到sorted set ,如果已经存在则更新其score值
    zrem [key] [value] 删除sorted set中的一个指定元素
    zscore [key] [value] 获取sorted set中的指定元素的score值
    zrank [key] [value] 获取sorted set 中的指定元素的排名,从零开始
    zcard [key] 获取sorted set中的元素个数
    zcount [key] [min] [max] 统计score值在给定范围内的所有元素的个数,包括min和max
    zrange [key] [start] [stop] 按照score排序后,获取指定排名范围内的元素,包括start和stop
    zincrby [key] [increment] [value] 让sorted set中的指定元素自增,步长为指定的increment值
    zrangebyscore [key] [min] [max] 按照score排序后,获取指定score范围内的元素,包括min和max
    zdiff,zinter,zunion 求差集、交集、并集
    # 添加一个或多个元素到sorted set ,如果已经存在则更新其score值
    zadd stus 85 jack 45 lucy 98 rose 68 wangsan
    # 删除sorted set中的一个指定元素
    zrem stus jack
    # 获取sorted set中的指定元素的score值
    zscore stus jack
    # 获取sorted set 中的指定元素的排名,从零开始
    zrank stus lucy   # 升序
    zrevrank stus jack  # 降序
    # 获取sorted set中的元素个数
    zcard stus
    # 统计score值在给定范围内的所有元素的个数
    zcount stus 45 85
    # 按照score排序后,获取指定排名范围内的元素
    zrange stus 0 1  # 升序
    zrevrange stus 0 1  # 降序 
    # 让sorted set中的指定元素自增,步长为指定的increment值
    zincrby stus 2 jack
    # 按照score排序后,获取指定score范围内的元素
    zrangebyscore stus 45 87

7.位操作Bitmaps:

  • Bitmaps 本身不是一种数据类型, 实际上它就是字符串(key-value) , 但是它可以对字符串的位进行操作

  • Bitmaps 单独提供了一套命令, 所以在 Redis 中使用 Bitmaps 和使用字符串的方法不太相同。 可以把 Bitmaps 想象成一个以位为单位的数组, 数组的每个单元只能存储 0 和 1, 数组的下标在 Bitmaps 中叫做偏移量

  • 实例:存储网站每天访问次数

  • 语法:

    bitmaps命令 说明
    setbit [key] [offset] [value] 设置Bitmaps中某个偏移量的值(只能是0或1),offset默认从0开始偏移
    getbit [key] [offset] 获取Bitmaps中某个偏移量的值
    bitcount [key] [start end] 返回字符串被设置为1的个数,例:100001中有2个1
    setbit users:20210101 1 1    -- 1
    setbit users:20210101 6 1    -- 100000
    setbit users:20210101 11 1   -- 10000000000
    getbit users:20210101 6      -- 获取第6位上的1

8.基数统计HyperLog:

  • Redis HyperLogLog 是用来做基数统计的算法

  • 基数:一个集合中,不重复的数

  • HyperLogLog 的优点是:在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的

  • 在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比

  • 但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素

  • 语法:

    HyperLog命令 说明
    pfadd [key] [value.....] 向key集合中加入value,添加成功返回1,否则返回0
    pfcount [key.....] 统计所选集合们中不重复的个数(所有集合值加在一起不重复)
    pfmerge [destkey] [sourcekey.....] 将sourcekey集合们的值合并到destkey集合
    pfadd program "java"
    pfadd program "java" "C++"
    pfcount program
    pfmerge hll3 hll1 hll2

9.经纬度GEO:

  • Redis 3.2 中增加了对 GEO 类型的支持。GEO,Geographic,地理信息的缩写。该类型,就是元素的 2 维坐标,在地图上就是经纬度。

  • redis 基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度 Hash 等常见操作

  • 语法:

    GEO命令 说明
    geoadd [key] [longitude] [latitude] [name]... 添加地理位置信息到key集合,longitude经度,latitude维度,name名称
    geopos [key] [name] 获取key集合中name的经纬度
    geodist [key] [name1] [name2] 获取两个位置之间的之直线距离
    georadius [key] [longitude] [latitude] [num] [unit] 获取以给定经纬度为中心,num长度,unit单位的半径内的元素
    geoadd china:city 121.47 31.23 shanghai
    geoadd china:city 121.47 31.23 shanghai china:city 121.47 31.23 shanghai
    geopos china:city shanghai
    geopos china:city shanghai beijing
    geoadd china:city 121.47 31.23 1000 km

你可能感兴趣的:(redis,redis,java,数据库)