Redis入门(二)-基本数据类型、基本命令

Redis学习

基本使用

启动

# 启动redis server
redis-server --port 6379

# 当存在多个Redis实例时,可以指定配置文件启动
redis-server ./redis.conf
redis-server ./redis16379.conf

# 启动redis client
redis-cli -p 6379 

关闭

redis-cli shutdown

检测Redis连接是否正常

ping
# 返回PONG则是正常的

入门

  • 添加key

    SET bar 1
    
  • 获取Redis中所有的键

    # 不建议在生产环境中用,因为可能存在很多的键
    # 支持 ?-匹配一个、 *-匹配任意字符、 []-表示范围,在[]里面的范围,a[b-d],表示可以匹配ab、ac、ad
    KEYS *
    
  • 判断某个键是否存在

    EXISTS bar
    # 返回1代表存在
    
  • 删除某个键

    DEL bar
    # 返回的删除的键的个数 这里是1
    DEL bar1 bar2
    # 那么此时返回的数字是2
    DEL bar
    # 此时返回的0,因为没有删除任何键,bar已经在第一条命令删除了
    
  • 判断某一个键的类型

    # 这里返回是string
    TYPE bar
    

基本数据类型

字符串

字符串类型的key,每个key只能对应一个字符串

  • 赋值、取值

    # 设置dhb这个key的值是hello
    SET dhb hello
    # 设置成功返回OK
    
    GET dhb
    # 返回 "hello"
    
  • 在原有字符串末尾追加

    # 向dhb这个key的尾部追加world,返回的是追加后字符串的总长度,这里返回10
    APPEND dhb world
    
  • 获取字符串长度

    # 获取dhb这个key的字符串长度
    STRLEN dhb
    
  • 同时设置多个键值

    # 设置git 这个键的value是github,svn这个键的value是svnhub
    MSET git github svn svnHub
    # 格式
    MSET key1 value1 key2 value2
    
  • 同时获得多个键的值

    # 获得git svn这两个键分别对应的value
    MGET git svn
    # 格式
    MGET key1 key2
    
  • 递增数字

    # 让jack这个键,递增
    INCR jack
    # 返回的是递增后的值
    # 这里返回1,因为这个键一开始不存在
    

    问:当两个Redis客户端连接同一个Redis时,都去调用INCR命令,在同一时刻拿到的原始数据都是1,那么此时两个客户端都是加1,这时Redis会把键值更新为2,却不是期望的3,如何处理?

    答:Redis中所有的命令都是原子操作,无论多少个客户端连接,都不会出现上面这种情况。

  • 递减数字

    # 让dhb这个键,递减,返回的是递减后的值
    DECR dhb
    
  • 增加指定的整数

    # 为dhb这个key,加4,返回的依旧是加完之后的值
    INCRBY dhb 4
    
  • 减去指定的整数

    # 让dhb这个key,减4,返回的减完之后的值
    DECRBY dhb 4
    
  • 增加指定浮点数

    # 为dhb这个key,加3.2,返回的是加完之后的值
    INCRBYFLOAT dhb 3.2
    

    值得注意的是,Redis没有提供减去指定浮点数的命令

散列 hash

一个散列类型的键可以包含 2 32 − 1 2^{32}-1 2321个字段.散列类型适合存储对象,一个对象的多个属性可以分为多个field存储

  • 赋值、取值

    # 设置 car这个键的 price 这个field的值是500
    HSET car price 500
    
    # 获取 car这个键的price这个field的value
    HGET car price
    
  • 同时设置多个键值

    # 设置car这个键的name、address 分别为benchi、china
    HMSET car name benchi address china
    # 格式
    HMSET key field1 value1 field2 value2
    
  • 同时获得一个对象多字段个值

    # 获得car这个键的name、address这两个字段的值
    HMGET car name address
    
  • 获得一个键的所有字段

    HGETALL car
    
    # 返回的是,字段、字段值
    1) "price"
    2) "500"
    3) "name"
    4) "benchi"
    5) "address"
    6) "china"
    
  • 判断某个字段是否存在

    # 判断 car这个key的name字段是否存在
    HEXISTS car name
    # 存在返回1、不存在返回0
    
  • 当字段不存在是赋值

    # 当car这个key的num字段不存在时,赋值为112,如果存在,则不执行任何操作
    HSETNX car num 112
    
  • 为字段增加数字

    # 让car这个键的price字段加45,返回的是加完之后的值
    HINCRBY car price 45
    
    # 虽然没有提供减的操作,但是可以用【加负数】实现减法操作
    HINCRBY car price -34
    
  • 删除字段

    # 删除car 这个键的price、name字段,返回的是被删除的个数,这里返回2
    HDEL car price name
    
  • 只获取所有字段名

    # 获取 car 的键的所有field
    HKEYS car
    
  • 只获取所有字段值

    # 获取car的键的所有field的值
    HVALS car
    
  • 获取字段的数量

    # 获得car这个键的filed的数量,返回的是field的数量
    HLEN car
    
列表

列表通常用来向两端添加元素。

  • 向列表两端添加元素

    # 向mynum这个列表左侧添加元素
    LPUSH mynum 1
    # 向mynum这个列表左侧添加两个元素
    LPUSH mynum 3 8 
    # 向mynum这个列表右侧添加元素
    RPUSH mynum 2
    # 向mynum这个列表右侧添加两个元素
    RPUSH mynum 3 8 
    
    # 返回的结果是增加元素后列表的长度
    
  • 获取列表中元素的个数

    # 获取mynum这个list的元素个数
    LLEN car
    
  • 从列表两端弹出元素

    # 从mynum这个list左侧弹出一个元素,返回值为弹出的元素
    LPOP mynum
    # 从mynum这个list右侧弹出一个元素,返回值为弹出的元素
    RPOP mynum
    #B的含义block,阻塞,直到有元素才会弹出,当mynum、mynum1、mynum2都有值时,会根据key的顺序依次弹出。场景应用在任务队列场景,当有多个任务队列,并且各个任务队列的任务优先级不一样时。
    
    BRPOP mynum mynum1 mynum3
    
  • 获得列表中的范围数据,LRANGE不会删除元素,仅仅返回,LPOP、RPOP则会删除元素

    # 获取mynum这个list的索引在2至5之间的元素,即返回索引为2,3,4,5这个四个索引的元素
    LRANGE mynum 2 5
    
    可以使用负索引,代表最右边的第N个元素
    LRANG mynum 2 -1
    
    # 格式
    LRANGE key start stop
    

    如果start的索引位置比stop的索引位置靠后,则会返回一个空的列表,如

    LRANG mynum -1 2
    # 返回empty list or set
    

    如果stop的索引位置大于实际索引范围,则会返回至列表最右边的元素,如

    LRANGE mynum 2 999
    # 返回,从索引2开始,一直到实际真正的索引的所有元素
    
  • 删除列表中指定的值

    # 删除左边前3个为4的值
    LREM mynum 3 4
    
    # 删除右边前2个为5的值
    LREM mynum -2 5
    
    # 删除所有为3的值
    LREM mynum 0 3
    
  • 向列表中固定位置插入元素

    #在mycar这个list中的1的元素前面 插入元素7
    LINSERT mycar before 1 7
    
    #格式
    LINSERT key before/after pivot value
    
  • 将一个列表尾部的元素放置到另一个list的首部

    # 将 mycar 这个list的尾部元素,弹出,并push进myhouse这个list的首部,两个list可以使同一个,这样就是循环向一个list的首部添加元素
    RPOPLPUSH mycar myhouse
    
    # 返回的是 该元素的值
    
集合

集合中的元素是唯一的,不允许重复的,而列表中则不是,可以有多个一样的元素

  • 增加、删除元素

    # 向集合setA中添加 1 2 3这三个元素
    SADD setA 1 2 3 
    
    # 删除集合setA中的 1 3 元素
    SREM setA 1 3
    
  • 获取集合中所有的元素

    # 获取setA中的所有元素
    SMEMBERS setA
    
  • 判断集合中是否存在某一个元素

    # 判断 setA中是否存在为2的元素,存在返回1,不存在返回0
    SISMEMBER setA 2
    
  • 集合的差集、交集、并集

    # 求集合A 和 集合B的差集,即属于A,但是不属于B的元素
    SDIFF setA setB
    
    # 可以使用多个集合,多个集合的差、交、并 按照顺序依次计算
    SDIFF setA setB setC
    
    # 先计算 A和B的差集,用这个差集和C再求差集
    
    # 求集合A 和 B 的交集
    SINTER setA setB
    
    # 求集合A 和 B的并集
    SUNION setA setB
    
  • 获取集合中元素的个数,返回的是一共的元素的个数

    SCARD setA
    
  • 随机获得集合中的元素

    # 随机获得集合中的元素
    SRANDMEMBER setA 1
    
    # 格式
    SRANDMEMBER key [count]
    
    # 如果 count 是正数,则会随机从集合中获得count个不重复的元素,如果count大于集合元素的个数,则返回全部元素
    # 如果 count是 负数,则随机从集合中获得 |count|个元素,但是可能重复
    
  • 从集合中弹出一个元素

    SPOP setB
    
有序集合

会根据score自动排序

  • 添加、删除

    # 向zset这个有序集合中添加两个 tom anmi这两个元素,根据这两个元素的score自动排序
    ZADD zset 78 tom 89 anmi
    
    ZREM zset tom
    
  • 获取某一个元素的分数

    # 获取zset这个有序集合中国tom这个元素的分数
    ZSCORE zset tom
    
  • 给某一个元素加分

    # 给有序集合zset中的tom元素加12分,返回的是加完分之后的分数
    ZINCRBY zset 12 tom
    
  • 获得某个范围内的元素列表。ZRANGE、ZREVRANGE

    # 获得有序集合zset,索引从0 到2的元素,排序是从小到大
    ZRANGE zset 0 2
    # 返回 tom anmi jack
    
    # 如果想要获得元素的同时还要获得对应的分数
    
    ZRANGE zset 0 2 WITHSCORES
    # 返回 tom 78 anmi 89 jack 99
    
    ZREVRANGE的返回顺序是从大到小
    

    如果两个元素的分数一样,则按照ASCI码中值进行排序,如果是中文,取决于对应的编码方式,最终还是会将其转换为ASCI码进行排序

  • 获取某个分数范围的元素

    # 获得有序集合zset中,分数在 >=10 <= 50的元素
    ZRANGEBYSCORE zst 10 50
    
    # 如果想要获得元素的同时还要获得对应的分数
    ZRANGEBYSCORE zst 10 50 WITHSCORES
    
    # 如果想要不包含其中的某一个端点、或者不包含两个端点,使用 ( ,  >=10 <50的元素
    
    ZRANGEBYSCORE zset 10 (50
    
    # 获取有序集合zset元素分数在10,50之间的前三个元素,不要忘了,这里是从小到大排序的,如果想要从大到小,则依旧使用ZREVRANGEBYSCORE
    ZRANGEBYSCORE zset 10 50 LIMIT 0 3
    
    # 格式
    ZRANGEBYSCORE key min max LIMIT offset count
    
  • 获得集合中元素的个数

    ZCARD zset
    
  • 获得指定分数范围内的元素的个数

    ZCOUNT zset 10 50
    
  • 获得元素的排名

    # 这里获得排名是按照从小到大的顺序
    ZRANK zset jack
    
    # 如果想要从大到小的顺序,则使用
    ZREVRANK zset jack
    
  • 删除指定分数范围内的元素

    # 删除有序集合zset中国分数>=10,<=20的元素
    ZREMRANGEBYSCORE zset 10 20
    

备注

  1. Redis不区分命令的大小写
  2. Redis对于键的命名最好采用, 对象类型:对象ID:对象属性来命名一个键

有用的资料

  1. Redis官方命令合集,忘记时可快速搜索
  2. Redis官方文档,无论什么时候,官方文档都是入门、解决问题的最推荐的方式

术语

  1. Time To Live -TTL,生存时间
  2. Race Condition,竞态条件
  3. Round-trip delay time(round trip time),往返时延
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值