Redis中常用的命令 基本 练习

本文详细介绍了Redis中的六种数据类型,包括String、List、Set、Zset、Hash以及Key,并列举了相应的命令操作,如String的`set`、`get`、`incrby`等,List的`lpush`、`lpop`,Set的`sadd`、`srem`,Zset的`zadd`、`zrange`,Hash的`hset`、`hget`以及Key的相关操作。此外,还讨论了Redis的原子性和多条命令的执行特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis中常用的六种数据类型(key与五种数据类型)

使用 select 索引 来切换数据库:select 5

String(字符串)

在redis中字符串的类型是安全的二进制类型,并且字符串的value

的最法制是512M,那就意味着 String类型并不是只能单单存储一个简单的字符串,也可以存储图片或者文件的序列化对象,字符串类型采用类似arraylist采用扩容机制

  • set key value 存储一个字符串到redis中

    127.0.0.1:6379[2]> set name hanhan
    OK
    
  • get key 从redis中取值

    127.0.0.1:6379[2]> get name
    "hanhan"
    
  • append key value 可以将内容追加到之前的key上 如果不存在则会创建key并存储

    127.0.0.1:6379[2]> append name add
    (integer) 9
    127.0.0.1:6379[2]> get name
    "hanhanadd"
    
  • strlen name 获得value占用的字节数(一个中文占3个字节)

    127.0.0.1:6379[2]> strlen name
    (integer) 9
    
  • incr key key对应的value必须是数字类型 否则会抛出异常 作用为如果key存在则让值进行自增1的操作,不存在则创建key的值为1

    127.0.0.1:6379[2]> set number 10
    OK
    127.0.0.1:6379[2]> incr number
    (integer) 11
    127.0.0.1:6379[2]> get number
    "11"
    
  • decr key 与incr相反进行的是-1的操作

    127.0.0.1:6379[2]> decr number
    (integer) 10
    127.0.0.1:6379[2]> get number
    "10"
    
  • incrby / decrby key 步长 与incr / decr 的作用类似 但是不是自增1而是根据指定的步长进行自增以及自减操作

    127.0.0.1:6379[2]> incrby number 5
    (integer) 15
    127.0.0.1:6379[2]> decrby number 10
    (integer) 5
    
  • mset key value key value…
    ​ 一次存储多个key value

    127.0.0.1:6379[2]> mset age 18 sex n status 1
    OK
    127.0.0.1:6379[2]> keys *
    1) "number"
    2) "sex"
    3) "name"
    4) "status"
    5) "age"
    
  • mget key key… 一次获取多个值

    127.0.0.1:6379[2]> mget number sex name age
    1) "5"
    2) "n"
    3) "hanhanadd"
    4) "18"
    

    ​ Redis的原子性:一次存储多个key value 与多次存储多个key value有什么区别?

​ 原子性是不可风分割的的组织,redis中的单条命令能够完成的操作,全部都是原子性的,因为Redis是单线程的,所以Redis在执行一条命令的途中不会被其他线程打断,也不会被切换但其他线程,而如果是多条命令的话,则不会具备原子性(也就是指

​ mset id 1 name 憨憨 age 19 这个操作是一条命令,不会被其他线程打断

​ set id 1 set name 憨憨 set age 19 这个操作是三条命令。中间可能被其他线程打断)

  • msetnx key value key value…

    一次存储多个key value 要么都成功 要么都失败

  • getrange key 起始下标 到此下标结束

    截取字符串 从起始下标取到结束下标,然后将值返回

    127.0.0.1:6379[2]> get name
    "hanhanadd"
    127.0.0.1:6379[2]> getrange name 1 3
    "anh"
    
  • setrange key 起始下标 value

    从起始下标开始 替换对应的value位数的值

    127.0.0.1:6379[2]> setrange name 1 name
    (integer) 9
    127.0.0.1:6379[2]> get name
    "hnamenadd"
    
  • setx key 过期时间 value 在设置key的同时 设置他的过期时间

    127.0.0.1:6379[2]> setex h 5 end
    OK
    127.0.0.1:6379[2]> get h
    "end"
    127.0.0.1:6379[2]> get h
    (nil)
    
  • getset key 先获取原本的值 再替换原本key的值

    127.0.0.1:6379[2]> getset status new
    "1"
    127.0.0.1:6379[2]> get status
    "new"
    
  • psetex key 过期时间 value 在设置key的同时 设置值他的过期时间是多少毫秒

    127.0.0.1:6379[2]> psetex g 6000 123
    OK
    127.0.0.1:6379[2]> get g
    "123"
    127.0.0.1:6379[2]> get g
    (nil)
    
  • exists key 用于判断key是否存在 存在返回1 不存在返回0

    127.0.0.1:6379[2]> exists name
    (integer) 1
    
  • setnx key valu

    如果kay存在则不做任何操作(操作失败) 如果key不存在则新增key,value操作成功返回1 此操作失败返回0

    127.0.0.1:6379[2]> setnx name 12
    (integer) 0
    
List(列表)

list 底层是双向链表,对于数据两端的数据操作效率要高,如果根据索引操控中间的数据小路较低,如果链表中存在上下引用,如果链表中只是单纯的存储数字类型的数据的话,会造成数据浪费

  • lpush / rpush key value …

    从左侧或者右侧插入值,如果key不存在则创建key,并返回值的个数

    127.0.0.1:6379[2]> lpush list lalala
    (integer) 1
    127.0.0.1:6379[2]> rpush lists hahaha
    (integer) 1
    
  • lpop/rpop key

    从左侧或者右侧从list中取出一个值

    127.0.0.1:6379[2]> lpop list
    "lalala"
    127.0.0.1:6379[2]> rpop lists
    "hahaha"
    
  • rpoplpush key key

    从第一个key的右侧拿出来一个值,放入到第二个集合的左侧

    127.0.0.1:6379[2]> rpoplpush llist list
    "5"
    
  • lrange key 起始下标 结束下标

    根据下标进行范围取值 -1代表最后一个下标,此操作值还在list中

    127.0.0.1:6379[2]> lrange llist 0 -1
    1) "1"
    2) "2"
    3) "4"
    
  • lindex key 下标

    根据下标从list左侧取值

    127.0.0.1:6379[2]> lindex llist 1
    "2"
    
  • llen key

    获取list长度

    127.0.0.1:6379[2]> llen llist
    (integer) 3
    
  • linsert key before|after value newvalue

    在value的前面或后面插入newvalue

    127.0.0.1:6379[2]> linsert llist before 2 new
    (integer) 4
    127.0.0.1:6379[2]> lrange llist 0 -1
    1) "1"
    2) "new"
    3) "2"
    4) "4"
    
  • lrem key 个数 value

    从集合的左侧删除指定个数的value值,然后返回删除掉的个数

    127.0.0.1:6379[2]> lrem llist 2 new
    (integer) 1
    
  • lset kay 下标 value

    将list中下标的值修改为value

    127.0.0.1:6379[2]> lrange llist 0 -1
    1) "1"
    2) "2"
    3) "4"
    
set(集合)

类似于java中的set,实际上也是提供跟set类似的功能,但是里面有自动排重的功能,并且没有索引,也就是指set中的值不能重复,当我们需要使用集合来存储数据,如果书有重复的内容,就采用list存储,如果数据中不准出现重复的内容就采用set存储,set的底层实际上就是key value形式的存储

  • sadd key value…

    存储数据,如果数据重复则会直接忽略掉value

    127.0.0.1:6379[2]> sadd shuzi 1 2 3 4 4 5
    (integer) 5
    
  • smembers key

    取出集合中所有的值 不会删除

    127.0.0.1:6379[2]> smembers shuzi
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    5) "5"
    
  • scard key

    返回集合中元素的个数

    127.0.0.1:6379[2]> scard shuzi
    (integer) 5
    
  • srem key value…

    删除集合中的value,并返回删除的个数

    127.0.0.1:6379[2]> srem shuzi 1 2
    (integer) 2
    
  • spop key [个数]

    从集合中随机拿走一个或者多个值(值会被删除)

    127.0.0.1:6379[2]> spop shuzi 2
    1) "3"
    2) "5"
    
  • srandmember key [个数]

    从集合中随机取出一个或多个值(值不会被删除)

    127.0.0.1:6379[2]> srandmember sets 5
    1) "4"
    2) "3"
    3) "2"
    4) "8"
    5) "0"
    
  • smove key 1 key 2

    将key1中的value拿走放入到key2中

    127.0.0.1:6379[2]> smove shuzi sets 2
    (integer) 0
    
  • sinter key1 key2 value

    返回两个集合中重复的元素

    127.0.0.1:6379[2]> sinter shuzi sets
    1) "2"
    2) "4"
    
  • sunion key1 key2

    返回集合中所有的元素(重复的指挥显示一个)

    127.0.0.1:6379[2]> sunion sets shuzi
     1) "0"
     2) "1"
     3) "2"
     4) "3"
     5) "4"
     6) "5"
     7) "6"
     8) "7"
     9) "8"
    10) "9"
    11) "21"
    12) "22"
    
  • sdiff key1 key2

    返回key2中没有的key1元素

    127.0.0.1:6379[2]> sdiff shuzi sets
    1) "21"
    2) "22"
    
  • sismember key value

    判断key中是否存在value,如果存在返回1 否则返回0

    127.0.0.1:6379[2]> sismember stes 22
    (integer) 0
    
zset

zset有序集合和set无序集合很像,两者都是不能有重复元素,不同的是zset里面有自己的排序规则,所以zset是有序的(这个顺序并不是我们存储的顺序,而是按照我们在存储数据的时候我们给的score来排序)

  • zadd key score value…

    添加元素 按照一个score 一个value的方式添加

    127.0.0.1:6379[2]> zadd zsets 1 name 2 age 3 apple
    (integer) 3
    
  • zrange key 起始score 结束score [withscores]

    返回key里面两个score之间的值包括

    127.0.0.1:6379[2]> zrange zsets 1 4
    1) "age"
    2) "apple"
    
  • zrangebyscore key 起始score 结束score

    按照score的顺序取出范围内的值,升序输出

    127.0.0.1:6379[2]> zrangebyscore zsets 1 4
    1) "name"
    2) "age"
    3) "apple"
    
  • zrevrangebyscore key 起始score 结束score

    按照score的顺序取出范围内的值,降序输出

    127.0.0.1:6379[2]> zrevrangebyscore zsets 4 1
    1) "apple"
    2) "age"
    3) "name"
    
  • zincrby key i value

    将key中value的score增加i的值

    127.0.0.1:6379[2]> zincrby zsets 2 apple
    "5"
    
  • zrank key value

    查看value在key中排第几个(从0开始)

    127.0.0.1:6379[2]> zrank zsets apple
    (integer) 2
    
  • zcount key 起始score 结束score

    查询key的score范围内有多少个元素

    127.0.0.1:6379[2]> zcount zsets 1 3
    (integer) 2
    
  • zrem key value…

    删除key的value

    127.0.0.1:6379[2]> zrem zsets apple
    (integer) 1
    
hsah(键值对集合)

hash是一个键值对集合 类似于java中的map hash 结构,非常方便我们的单个java对象

对象由对象如下: user id=1 name=憨憨 sex=女 age=19

如果我们用string来存储上面的 user的话,需要将对象序列化存入到redis,如果我们想修改对象的某个属性,我们需要将整个user都需要反序列化修改age=20 再次将user序列化存入到redis,在修改数据的时候需要反复序列化增加开销。

如果过我们使用hash 来存储:

​ key 1 value Field value

​ 1_id 1

​ 1_name 憨憨

​ 1_sex 女

​ 1_age 18

我们只需要通过用户id+属性名称取修改对应的值就行了,不需要反复序列化以及存储数据,节省开销。

  • hset key field value

    根据键值对的形式向key中添加值

    127.0.0.1:6379[2]> hset hsets name lalala
    (integer) 1
    
  • hget key field

    根据key以及属性名取出对应的value

    127.0.0.1:6379[2]> hget hsets name
    "lalala"
    
  • hexists key field

    判断key中是否存在属性,如果存在返回1 不存在返回0

    127.0.0.1:6379[2]> hexists hsets name
    (integer) 1
    
  • hkeys key

    取出所有的key

    127.0.0.1:6379[2]> hkeys hsets
    1) "name"
    2) "age"
    3) "number"
    
  • hvals key

    取出所有的value

    127.0.0.1:6379[2]> hvals hsets
    1) "lalala"
    2) "12"
    3) "aa"
    
  • hincrby key 属性 正负值

    对属性的值进行加减操作

    127.0.0.1:6379[2]> hincrby hsets age 2
    (integer) 14
    
  • hsetnx key 属性 值

    当属性不存在的时候,添加属性以及值,如果属性存在则不进行任何操作

    127.0.0.1:6379[2]> hsetnx hsets hh 123
    (integer) 1
    
key

key Redis中最关键的东西,所有的操作都是通过key来完成的

  • **keys ***

    获取所的key

    127.0.0.1:6379[2]> keys *
     1) "number"
     2) "name"
    	...
    
    
  • exits key

    判断key是否存在

    127.0.0.1:6379[2]> exists name
    (integer) 1
    
  • type key

    查询key的类型

    127.0.0.1:6379[2]> type number
    string
    
  • del key

    删除指定的key,需要注意的是key中由一些特殊字符需要将key引起来

    127.0.0.1:6379[2]> del name
    (integer) 1
    
  • unlink key

    异步删除key

    127.0.0.1:6379[2]> unlink age
    (integer) 1
    
  • expire key seconds

    给key设置过期时间(单位秒)

    127.0.0.1:6379[2]> expire sex 5
    (integer) 1
    127.0.0.1:6379[2]> get sex
    "n"
    127.0.0.1:6379[2]> get sex
    (nil)
    
  • ttl key

    查询剩余过期时间 -2代表已删除 -1 代表永久有效

    127.0.0.1:6379[2]> ttl sex
    (integer) -2
    
  • dbsize key

    查看数据库数量

    127.0.0.1:6379[2]> ttl sex
    (integer) -2
    
  • flushdb

    清空当前数据库

    127.0.0.1:6379[2]> flushdb
    OK
    127.0.0.1:6379[2]> dbsize
    (integer) 0
    
  • flushshall

    清空所有数据库

    127.0.0.1:6379[2]> flushall
    OK
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值