美文网首页数据库
12. Redis 数据类型和常用命令

12. Redis 数据类型和常用命令

作者: 随便写写咯 | 来源:发表于2021-03-06 22:30 被阅读0次

    6. Redis数据类型

    命令不区分大小写, key和value区分大小写
    

    6.1 字符串(string)

    6.1.1 创建一个key

    127.0.0.1:6379> set code 'hello world'
    OK
    127.0.0.1:6379> get code
    "hello world"
    
    127.0.0.1:6379> type code # type用来查看数据类型
    string
    
    # 命令不区分大小写, 数据区分大小写
    
    127.0.0.1:6379> SET NAME dave
    OK
    127.0.0.1:6379> get NAME
    "dave"
    127.0.0.1:6379> get name
    (nil)
    
    # ex 用来指定有效期, 以秒为单位
    
    127.0.0.1:6379> set name aaa ex 5 
    OK
    127.0.0.1:6379> get name
    "aaa"
    127.0.0.1:6379> get name # 5秒后过期
    (nil)
    
    # nx: 当key不存在时, 才对其进行赋值
    
    127.0.0.1:6379> get NAME
    "dave"
    127.0.0.1:6379> set NAME bbb nx  # NAME已经存在, 因此不会重新赋值
    (nil)
    127.0.0.1:6379> get NAME
    "dave"
    
    # xx: 当key存在时, 才对其进行赋值
    
    127.0.0.1:6379> get name
    (nil)
    127.0.0.1:6379> set name ccc xx  # name不存在, 因此不会赋值
    (nil)
    127.0.0.1:6379> set NAME ccc xx
    OK
    127.0.0.1:6379> get NAME
    "ccc"
    

    6.1.2 获取一个key

    127.0.0.1:6379> get name
    (nil)
    127.0.0.1:6379> get NAME
    "ccc"
    
    # mget: 同时获取多个key
    
    127.0.0.1:6379> mget name NAME
    1) (nil)
    2) "ccc"
    
    # keys配合通配符, 获取指定模式的key, 但是不会显示其值
    
    127.0.0.1:6379> set key1 value1
    OK
    127.0.0.1:6379> set key2 value2
    OK
    127.0.0.1:6379> keys k*
    1) "key1"
    2) "key2"
    
    # keys *: 获取所有的key
    
    1) "key1"
    2) "code"
    3) "NAME"
    4) "key2"
    

    6.1.3 删除key

    127.0.0.1:6379> del key1  # 删除单个key
    (integer) 1
    127.0.0.1:6379> del key2 code # 删除多个key
    (integer) 2
    127.0.0.1:6379> keys *
    1) "NAME"
    

    6.1.4 批量创建多个key

    # mset: 奇数位为key, 偶数位为值
    
    127.0.0.1:6379> mset 1 2 3 4 5 6 
    OK
    127.0.0.1:6379> mget 1 3 5
    1) "2"
    2) "4"
    3) "6"
    

    6.1.5 追加数据

    # append: 结果仍是字符串
    
    127.0.0.1:6379> append city "sh gz sz" 
    (integer) 10
    127.0.0.1:6379> get city
    "bjsh gz sz"
    
    127.0.0.1:6379> set country cn
    OK
    127.0.0.1:6379> append country " usa au jp"  # 追加时, 左侧要有一个空格, 避免追加后和原有的字符串连在一起
    (integer) 12
    127.0.0.1:6379> get country
    "cn usa au jp"
    

    6.1.6 设置新值并同时返回旧值

    127.0.0.1:6379> get NAME
    "ccc"
    127.0.0.1:6379> getset NAME ddd
    "ccc"
    127.0.0.1:6379> get NAME
    "ddd"
    

    6.1.7 查看字符串key对应值所占的字节数

    127.0.0.1:6379> get NAME
    "ddd"
    127.0.0.1:6379> strlen NAME
    (integer) 3
    

    6.1.8 判断key是否存在

    127.0.0.1:6379> exists NAME
    (integer) 1  # 1表示存在
    127.0.0.1:6379> del NAME
    (integer) 1
    127.0.0.1:6379> exists NAME
    (integer) 0 # 0表示不存在
    

    6.1.9 查看key的过期时间

    # ttl: -1 表示永不过期, -2 表示已经过期或者key不存在, 1,2,3..表示剩余有效时间, 以秒为单位
    
    127.0.0.1:6379> ttl city 
    (integer) -1
    

    6.1.10 重新设置key的过期时间

    # expire
    
    127.0.0.1:6379> set location la ex 10
    OK
    127.0.0.1:6379> expire location 20
    (integer) 1
    127.0.0.1:6379> ttl location
    (integer) 16
    127.0.0.1:6379> ttl location
    (integer) 15
    127.0.0.1:6379> ttl location
    (integer) 14
    127.0.0.1:6379> ttl location
    (integer) 13
    

    6.1.11 取消key的有效期

    # persist
    
    127.0.0.1:6379> set  location la ex 20
    OK
    127.0.0.1:6379> ttl location
    (integer) 16
    127.0.0.1:6379> persist location
    (integer) 1
    127.0.0.1:6379> ttl location
    (integer) -1
    

    6.1.12 数值递增

    • 比如点赞功能
    redis实现自增, 比如点赞功能, 由于redis是单线程处理请求, 因为自增的时候不会冲突, 是串行执行
    
    # incr
    
    127.0.0.1:6379> set id 1 
    OK
    127.0.0.1:6379> incr id
    (integer) 2
    127.0.0.1:6379> incr id
    (integer) 3
    127.0.0.1:6379> incr id
    (integer) 4
    127.0.0.1:6379> get id
    "4"
    
    # 当key不存在, 那么incr会从0开始自增, 每次加1
    
    127.0.0.1:6379> get number
    (nil)
    127.0.0.1:6379> incr number
    (integer) 1
    127.0.0.1:6379> get number
    "1"
    

    6.1.13 数值递减

    • 比如用在取消点赞功能
    # decr
    
    127.0.0.1:6379> get id
    "4"
    127.0.0.1:6379> decr id
    (integer) 3
    127.0.0.1:6379> decr id
    (integer) 2
    127.0.0.1:6379> decr id
    (integer) 1
    127.0.0.1:6379> decr id
    (integer) 0
    127.0.0.1:6379> decr id
    (integer) -1 # 可以递减成负数
    127.0.0.1:6379> decr id
    (integer) -2
    
    # 如果key不存在, decr会从0开始自减, 每次减1
    
    127.0.0.1:6379> get number
    "1"
    127.0.0.1:6379> get num
    (nil)
    127.0.0.1:6379> decr num
    (integer) -1
    

    6.1.14 数值增加

    # incrby NUM
    
    127.0.0.1:6379> get num
    (nil)
    127.0.0.1:6379> decr num
    (integer) -1
    127.0.0.1:6379> incrby num 1
    (integer) 0
    127.0.0.1:6379> incrby num 10
    (integer) 10
    

    6.1.15 数值减少

    # decrby NUM
    
    127.0.0.1:6379> get num
    (nil)
    127.0.0.1:6379> decr num
    (integer) -1
    127.0.0.1:6379> incrby num 1
    (integer) 0
    127.0.0.1:6379> incrby num 10
    (integer) 10
    127.0.0.1:6379> decrby num 10
    (integer) 0
    

    6.2 列表(list)

    有序
    双向管道, 左右都可以写入, 先进先出
    列表值可以重复
    

    6.2.1 创建列表并插入数据

    127.0.0.1:6379> lpush city bj sh gz sz
    (integer) 4
    127.0.0.1:6379> type city
    list
    
    127.0.0.1:6379> rpush country cn jp kr 
    (integer) 3
    

    6.2.2 查看列表中元素的个数

    127.0.0.1:6379> llen city
    (integer) 4
    

    6.2.3 获取指定位置的数据

    lrange: 从左到右, 按照范围, 必须指定两个索引编号
    没有rrange
    
    127.0.0.1:6379> lrange city 0 0  # 查看第0个元素
    1) "sz"
    127.0.0.1:6379> lrange city 0 2
    1) "sz"
    2) "gz"
    3) "sh"
    127.0.0.1:6379> lrange city 0 -1 # 查看列表所有元素
    1) "sz"
    2) "gz"
    3) "sh"
    4) "bj"
    
    lindex: 从左到右, 按照索引编号, 取单个值
    
    127.0.0.1:6379> lindex city 0
    "sz"
    

    6.2.4 修改列表指定索引对应的值

    127.0.0.1:6379> lrange city 0 -1
    1) "sz"
    2) "gz"
    3) "sh"
    4) "bj"
    127.0.0.1:6379> lset city 0 as
    OK
    127.0.0.1:6379> lrange city 0 -1
    1) "as"
    2) "gz"
    3) "sh"
    4) "bj"
    

    6.2.5 移除列表数据

    元素全部移除后, 列表也会被删除
    
    lpop: 从左移除
    
    127.0.0.1:6379> lrange city 0 -1
    1) "as"
    2) "gz"
    3) "sh"
    4) "bj"
    127.0.0.1:6379> lpop city
    "as"
    127.0.0.1:6379> lrange city 0 -1
    1) "gz"
    2) "sh"
    3) "bj"
    
    rpop: 从右移除
    
    127.0.0.1:6379> lrange city 0 -1
    1) "gz"
    2) "sh"
    3) "bj"
    127.0.0.1:6379> rpop city
    "bj"
    127.0.0.1:6379> lrange city 0 -1
    1) "gz"
    2) "sh"
    

    6.3 集合

    set是string类型的无序集合, 集合中的成员是唯一的, 这就意味着集合中不能出现重复的数据
    可以在两个不同的集合中对数据进行比对并取值, 常用于取值判断, 统计交集等场景
    
    实现共同好友
    集合的值不能重复
    无需
    集合间操作
    

    6.3.1 创建集合

    127.0.0.1:6379> sadd set1 v1
    (integer) 1
    127.0.0.1:6379> sadd set2 v1 v4
    (integer) 2
    
    # 集合中的重复值会被自动去重
    
    127.0.0.1:6379> sadd set3 v1 v1 v1
    (integer) 1
    127.0.0.1:6379> smembers set3
    1) "v1"
    

    6.3.2 查看集合中所有元素

    127.0.0.1:6379> smembers set1
    1) "v1"
    127.0.0.1:6379> smembers set2
    1) "v4"
    2) "v1"
    

    6.3.3 集合中追加数值

    127.0.0.1:6379> smembers set3
    1) "v1"
    127.0.0.1:6379> sadd set3 v1  # 追加重复数据不会生效, 自动去重
    (integer) 0
    127.0.0.1:6379> smembers set3
    1) "v1"
    127.0.0.1:6379> sadd set3 v2
    (integer) 1
    127.0.0.1:6379> smembers set3
    1) "v2"
    2) "v1"
    

    6.3.4 删除集合中的元素

    127.0.0.1:6379> smembers set3
    1) "v2"
    2) "v1"
    127.0.0.1:6379> srem set3 v2
    (integer) 1
    127.0.0.1:6379> smembers set3
    1) "v1"
    

    6.3.5 集合间交集

    127.0.0.1:6379> smembers set1
    1) "v1"
    127.0.0.1:6379> smembers set2
    1) "v4"
    2) "v1"
    
    127.0.0.1:6379> sinter set1 set2
    1) "v1"
    

    6.3.6 集合间差集

    127.0.0.1:6379> sdiff set1 set2 # 取差集时, 第一个集合的元素要比第二个集合多
    (empty list or set)
    127.0.0.1:6379> sdiff set2 set1
    1) "v4"
    

    6.3.6 集合间并集

    127.0.0.1:6379> sunion set1 set2
    1) "v4"
    2) "v1"
    

    6.4 有序集合sorted set

    集合自动排序
    靠打分机制, 给每个元素打分; 不同的元素可以打分相同, 一个元素只能有一个分数
    
    redis有序集合和集合一样也是string类型的元素集合, 且不允许重复的成员, 会被自动去重
    不同的是, 每个元素都会关联一个double(双精度浮点型)类型的分数,
    redis正是通过该分数来为集合中的成员进行从小打到的排序, 有序集合的成员是唯一的, 但分数是可以重复的
    集合是通过哈希表来实现, 所以添加, 删除, 查找的复杂度都是O(1), 集合中最大的成员数为2^32-1个, 每个集合开业存储40多亿个成员, 常用于排行榜场景
    
    有序集合的特点:
    有序
    无重复元素
    每个元素是由score和value组成
    score可以重复
    value不可以重复
    对于同一个value, 多次打分, 后来的生效
    

    6.4.1 生成有序集合

    127.0.0.1:6379> zadd set 100 dave
    (integer) 1
    127.0.0.1:6379> zadd set 100 dave 90 admin 80 boss # 生成多个元素有序集合, 奇数位为分数, 偶数位为值
    (integer) 2
    

    6.4.2 生成排行榜

    127.0.0.1:6379> zadd set 100 dave 90 admin 80 boss
    (integer) 2
    127.0.0.1:6379> zrange set 0 -1  # zrange表示正序从小到大排序
    1) "boss"
    2) "admin"
    3) "dave"
    
    127.0.0.1:6379> zrevrange set 0 -1 # zrevrange表示倒序从大到小排序
    1) "dave"
    2) "admin"
    3) "boss"
    
    127.0.0.1:6379> zrevrange set 0 -1 withscores # withscores显示每个元素的分数
    1) "dave"  
    2) "100"
    3) "admin"
    4) "90"
    5) "boss"
    6) "80"
    

    6.4.3 获取集合中元素的个数

    127.0.0.1:6379> zcard set
    (integer) 3
    

    6.4.4 基于索引返回value

    127.0.0.1:6379> zrange set 0 -1 
    1) "boss"
    2) "admin"
    3) "dave"
    127.0.0.1:6379> zrange set 0 1
    1) "boss"
    2) "admin"
    127.0.0.1:6379> zrange set 0 100 # 超出索引范围不会报错
    1) "boss"
    2) "admin"
    3) "dave"
    

    6.4.5 返回某个value的索引(排名)

    127.0.0.1:6379> zrange set 0 -1
    1) "boss"
    2) "admin"
    3) "dave"
    127.0.0.1:6379> zrank set boss  # 集合安装正序排名
    (integer) 0
    127.0.0.1:6379> zrevrank set boss # 集合按照倒序排名
    (integer) 2
    

    6.4.6 获取某个value的分数

    127.0.0.1:6379> zscore set dave
    "120"
    

    6.4.7 删除集合中的元素

    127.0.0.1:6379> zrange set 0 -1
    1) "boss"
    2) "admin"
    3) "dave"
    127.0.0.1:6379> zrem set boss
    (integer) 1
    127.0.0.1:6379> zrange set 0 -1
    1) "admin"
    2) "dave"
    

    6.5 哈希

    hash特别适合用于对象存储
    hash是一个string类型的字段(field)和值(value)的映射表, redis中每个hash可以存储2^32-1个键值对, 类似于字典存放了多个k/v对
    
    图片.png

    6.5.1 生成hashkey

    127.0.0.1:6379> hset 9527 name zhouxingxing age 20 # 奇数位为field, 偶数位为value
    (integer) 2
    127.0.0.1:6379> type 9527
    hash
    127.0.0.1:6379> hgetall 9527
    1) "name"
    2) "zhouxingxing"
    3) "age"
    4) "20"
    
    # 增加field
    
    127.0.0.1:6379> hset 9527 gender male
    (integer) 1
    127.0.0.1:6379> hgetall 9527 # 获取所有field的value
    1) "name"
    2) "zhouxingxing"
    3) "age"
    4) "20"
    5) "gender"
    6) "male"
    

    6.5.2 获取hash key的对应字段的值

    127.0.0.1:6379> hget 9527 name # hget获取单个field的value
    "zhouxingxing"
    
    127.0.0.1:6379> hmget 9527 name age # hmget获取多个field的value
    1) "zhouxingxing"
    2) "20"
    

    6.5.3 删除一个hash key的对应字段

    127.0.0.1:6379> hdel 9527 name
    (integer) 1
    127.0.0.1:6379> hget 9527 name
    (nil)
    

    6.5.4 批量设置hash key的多个field和value

    127.0.0.1:6379> hmset alibaba ceo mayun age 50 gender male
    OK
    127.0.0.1:6379> hgetall alibaba
    1) "ceo"
    2) "mayun"
    3) "age"
    4) "50"
    5) "gender"
    6) "male"
    

    6.5.5 获取hash中多个指定字段的值

    127.0.0.1:6379> hmget alibaba ceo age # hmget获取多个字段对应的value, hget获取单个字段对应的value
    1) "mayun"
    2) "50"
    

    6.5.6 获取hash中所有字段的field

    127.0.0.1:6379> hkeys alibaba
    1) "ceo"
    2) "age"
    3) "gender"
    

    6.5.7 获取hash key对应所有field的value

    127.0.0.1:6379> hvals alibaba
    1) "mayun"
    2) "50"
    3) "male"
    

    6.5.8 获取指定hash key的所有filed及value

    127.0.0.1:6379> hgetall alibaba
    1) "ceo"
    2) "mayun"
    3) "age"
    4) "50"
    5) "gender"
    6) "male"
    

    6.5.9 删除hash key

    127.0.0.1:6379> del alibaba
    (integer) 1
    

    6.5.10 查看某个key是否存在

    127.0.0.1:6379> exists alibaba
    (integer) 0
    

    7. Redis常用命令

    7.1 info

    显示当前节点redis的运行状态, 可以跟字段名

    127.0.0.1:6379> info
    # Server
    redis_version:5.0.3
    redis_git_sha1:00000000
    redis_git_dirty:0
    redis_build_id:28849dbea6f07cc8
    redis_mode:standalone
    os:Linux 4.18.0-193.el8.x86_64 x86_64
    arch_bits:64
    multiplexing_api:epoll
    atomicvar_api:atomic-builtin
    gcc_version:8.3.1
    process_id:753
    run_id:fb7c86f04a4936a880dfd3d00bef4a7a35e3945a
    tcp_port:6379
    uptime_in_seconds:28625
    
    127.0.0.1:6379> info server # 查看server字段信息
    # Server
    redis_version:5.0.3
    redis_git_sha1:00000000
    redis_git_dirty:0
    redis_build_id:28849dbea6f07cc8
    redis_mode:standalone
    os:Linux 4.18.0-193.el8.x86_64 x86_64
    arch_bits:64
    multiplexing_api:epoll
    atomicvar_api:atomic-builtin
    gcc_version:8.3.1
    process_id:753
    run_id:fb7c86f04a4936a880dfd3d00bef4a7a35e3945a
    tcp_port:6379
    uptime_in_seconds:28664
    uptime_in_days:0
    hz:10
    configured_hz:10
    lru_clock:4422089
    executable:/usr/bin/redis-server
    config_file:/etc/redis.conf
    
    info replication
    info clients
    

    7.2 config

    用于查看当前redis配置, 以及不重启redis服务实现动态更改redis配置等

    注意:不是所有配置都可以动态修改, 且以此方式无法持久保存

    举例: config临时设置redis密码

    config set requirepass 123456789
    

    举例: 获取当前redis的配置信息

    config get *
    

    举例: 查看某一指令的配置信息

    127.0.0.1:6379> config get bind
    1) "bind"
    2) "0.0.0.0"
    

    举例: 临时提高redis占用的内存

    redis一般内存设为物理机的一般, 专用来存放数据
    至于其程序运行, 还需要额外占用内存空间
    
    config set maxmemory 8589934592 #以字节为单位
    

    7.3 select

    切换数据库

    select 1
    

    注意: redis cluster模式下不支持多个数据库.

    7.4 keys命令

    查看当前库下的所有key, 支持通配符, 生产环境禁用

    7.5 bgsave

    手动在后台执行RDB持久化操作

    7.6 dbsize

    返回当前库下的所有key的数量
    info命令的最后一行会返回所有库所有key的数量

    7.7 flushdb

    强制清空当前库中所有的key, 当前所在库

    7.8 flushall

    强制清空当前redis服务器所有库中的所有key, 所有库

    生产建议把flushdb, flushall, config命令都禁用, 清空命令不应该使用, 而config命令也尽量不要去临时调整redis配置

    vim /etc/redis.conf
    rename-command flushall ""
    rename-command flushdb ""
    rename-command config "" # 直接禁用某个命令, 此为ranme-command的配置在登录redis后执行config get命令是查不到的, 并不会显示
    rename-command config linux # 这样想要执行config, 只能执行linux, 相当于把config换个名字
    

    相关文章

      网友评论

        本文标题:12. Redis 数据类型和常用命令

        本文链接:https://www.haomeiwen.com/subject/sbbbtltx.html