1.常用命令

命令 说明 返回值 时间复杂度
keys */[pattern] 遍历所有符合条件的key,一般不在生产环境使用 所有key O(n)
dbsize 计算key的总数 n O(1)
exists key 判断一个key是否存在 0、1 O(1)
del key [key...] 删除指定的key-value 0、1 O(1)
expire key seconds 指定key在seconds秒后过期 0、1 O(1)
ttl key 查询key剩余的过期时间 剩余时间(返回-2表示key已经被删除了,-1表示不过期) O(1)
persist key 去掉key的过期时间 0、1 O(1)
type key 查询key的类型 string、hash、list、set、zset、none O(1)

2.单线程Redis为什么这么快?

  • 纯内存
  • 非阻塞IO
  • 单线程避免了线程切换和竞态消耗

单线程要注意:

  • 一次只能运行一条命令
  • 拒绝长(慢)命令:keys、flushall、flushdb、slow lua script、mutil/exec、operate big value

2.数据类型

string类型

字符串是Redis中最常用的类型,是一个由字节组成的序列,它在Redis中是二进制安全的,该类型可以接受任何格式的数据。value最多可以容纳的数据长度为512MB。

使用场景:

  • 缓存
  • 计数器
  • 分布式锁
  • 分布式id生成

常用命令:

命令 说明 例子
get key 获取key的值 get name
mget key1 key2 ... 批量获取key1、key2的值 mget name age
set key value 设置key的值为value,不管key是否存在都设置 set name mike
setnx key value 设置key的值为value,key不存在才设置 setnx name mike
set key value xx 设置key的值为value,key存在才设置 setxx name mike xx
mset key1 value1 key2 value2 ... 批量设置key1的值为value1,key2的值为value2... mset name lucy age 10
del key 删除key del name
incr key key的值加1 incr age
decr key key的值减1 decr age
incrby key k key的值加k incrby age 10
decrby key k key的值减k decrby age 10
getset key newvalue set key newvalue并返回旧的value getset name alice
append key value 将value追加到旧的value append name hh
strlen key 获取key的字符串长度(注意中文) strlen name
incrbyfloat key f 为key的值增加f,用于浮点数据 incrbyfloat monery 9.9
getrange key start end 获取字符串指定下标所有的值 getrange name 1 2
setrange key index value 设置指定下标所有对应的值 setrange name 1 aa

hash类型

一个key中存在多个map。Redis中的hash可以看成具有String key和String value的map容器,可以将多个key-value存储到一个key中。每一个Hash可以存储4294967295个键值对

使用场景:

  • 存储用户信息

常用命令:

命令 说明 例子
hget key field 获取hash key下的field的value hget user name
hset key field value 设置hash key下的field的的值为value hset user name zhangsan
hdel key field 删除hash key下的field hdel user name
hexists key field 判断hash key下的field是否存在 hexists user name
hlen key 获取hash key下的field数量 hlen user
hmget key field1 field2 ... 批量获取hash key下的field1、field2的值 hmget user name age
hmset key field1 value1 field2 value2 ... 批量设置hash key下的field1值为value、field2值为value2 hmset user age 20 phone 15000000000
hgetall key 获取hash key下的所有field和value hgetall user
hvals key 获取hash key下的所有field的value hvals user
hkeys key 获取hash key下的所有field hkeys user
hsetnx key field value 设置hash key下的field的的值为value(如果field存在则不设置) hsetnx user name lisi
hincrby key field n 设置hash key下的field的的值加n hincrby user age 10
hincrbyfloat key field f 设置hash key下的field的的值加f(浮点数版) hincrbyfloat user balance 9.9

list(列表)类型

Redis的列表是有序的,允许用户从序列的两端推入或者弹出元素,列表由多个字符串值组成的有序可重复的序列,是链表结构,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。List中可以包含的最大元素数量是4294967295

使用场景:

  • 微博最新消息排行榜
  • 简单的消息队列

常用命令:

命令 说明 例子 结果
lpush key value1 value2 ... 从列表左端插入值 lpush list1 c b a abc
rpush key value1 value2 ... 从列表右端插入值 rpush list2 a b c abc
linsert key before|after value newValue 在指定的值前|后插入newValue linsert list after a A a b c d => a A b c d
lpop key 从列表左侧弹出一个item lpop list1 a
rpop key 从列表右侧弹出一个item rpop list2 c
lrem key count value 根据count值,从列表中删除所有value相等的项
1.count>0,从左到右,删除最多count个value相等的项
2.count<0,从右到左,删除最多Math.abs(count)个value相等的项
3.count=0,删除所有value相等的项
lrem list 2 a
lrem list -2 a
lrem list 0 a
a b a c a d => b c a d
a b a c a d => a b c d
a b a c a d => b c d
ltrim key start end 按照索引范围修剪列表 ltrim list 1 4 a b c d e f => b c d e
lrange key start end 获取列表指定索引范围内的项(包含end) lrange list 0 1 a b c d e f => a b
lindex key index 获取列表指定索引的的项 lindex list 1 a b c d => b
llen key 获取列表的长度 llen list a b c d => 4
lset key index newValue 设置列表指定索引的值为newValue lset list 2 x a b c d => a b x d
blpop key timeout lpop的阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞,如果列表中没有值他会一直等待一个新的值插入 blpop list 100
brpop key timeout rpop的阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞,如果列表中没有值他会一直等待一个新的值插入 brpop list 100

注意:

  • lpush + lpop = Stack (实现一个栈的功能)
  • lpush + rpop = Queue (实现一个队列功能)
  • lpush + ltrim = Capped Collection (实现有固定数量的列表)
  • lpush + brpop = Message Queue (实现消息队列)

set(集合)类型

Redis的集合是无序不可重复的。和列表一样,在执行插入和删除以及判断是否存在某元素时,效率是很高的。集合最大的优势在于可以进行交集并集差集操作。Set可包含的最大元素数量是4294967295

使用场景:

  • 使用交集求共同好友
  • 类似微博好友推荐,可以根据tag求交集
  • 利用唯一性,可以统计访问网站的所有独立IP

常用命令:

命令 说明 例子 结果
sadd key element 向集合中添加element(可以是多个,如果element已存在,则会添加失败) sadd set a b c a b c
srem key element 将集合key中的element删除 srem set a a b c => d c
scard key 计算集合大小 scard set a b c => 3
sismember key value 判断value是否在集合key中存在 sismember set a a b c => 1
srandmember key [count] 从集合中随机挑选count个元素,默认为1,不会破坏集合 srandmember key a b c => b
spop key [count] 从集合中随机弹出count个元素,默认为1,会将元素从集合中删除 spop set a b c => a c
smembers key 获取集合中所有元素 smembers set a b c => c a b
sdiff key1 key2 获取key1、key2的差集 sdiff set1 set2 a b c d e,a d e f g => c b
sinter key1 key2 获取key1、key2的交集 sinter set1 set2 a b c d e,a d e f g => a d e
sunion key1 key2 获取key1、key2的并集 sunion set1 set2 a b c d e,a d e f g => a b c d e f g

zset(有序集合)类型

有序集合有顺序,不能重复。元素不能重复,score可以重复。

和Set很像,都是集合,都不允许出现重复的元素。

和Set之间差别在于有序集合中每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。尽管有序集合中的成员必须是卫衣的,但是分数(score)却可以重复

使用场景:

  • 各种游戏排行榜、音乐排行榜等

常用命令:

命令 说明 例子 结果
zadd key score1 element1 score2 element2 ... 向有序集合中添加score和element(score可重复,element不可重复) zadd zset 10 a 20 b
zrem key element1 element2 ... 删除元素 zrem zset a b
zscore key element 返回元素element的分数 zscore zset a 10
zincrby key increScore element 将元素element的score增加increScore zincrby zset 10 a 20
zcard key 返回元素的总个数 zcard zset a b => 2
zrank key element 获取元素element的排名 zrank zset a
zrange key start end [withscores] 返回指定索引范围内的升序元素(根据score) zrange zset 0 100 withscores
zrangebyscore key minScore maxScore [withscores] 获取指定分数范围内的升序元素(根据score) zrangebyscore zset 50 100 withscores
zcount key minScore maxScore 获取在指定分数范围内的元素个数 zcount zset 60 100 2
zremrangebyrank key start end 删除指定排名内的升序元素 zremrangebyrank zset 0 1 剩下a c
zremrangebyscore key minScore maxScore 删除指定分数内的升序元素 zremrangebyscore zset 0 50 剩余a c
zrevrank key element 与zrank相反,获取从高到低的排名
zrevrange key start end [withscores] 与zrange相反,返回从高到低的分数排名
zrangebyscore key minScore maxScore [withscores] 与zrangebyscore相反,返回指定分数范围内从高到低的排名
zinterstore key1 key2 计算两个集合交集
zunionstore key1 key2 计算两个集合并集

Redis学习2:Redis的数据类型和常用操作的更多相关文章

  1. redis学习 (key)键,Python操作redis 键 (二)

    # -*- coding: utf-8 -*- import redis #这个redis 连接不能用,请根据自己的需要修改 r =redis.Redis(host=") 1. delete ...

  2. Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝

    一.运算符及优先级 Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 1.算数运算符 运算符 描述 实例,a=20,b=10 + 加 a+b输出结果30 - 减 a-b输出结果 ...

  3. Redis学习笔记--五种数据类型的使用场景

    String 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...

  4. Redis五大数据类型的常用操作

    在上一篇博文<centos安装redis>中,已经详细介绍了如何在centos上安装redis,今天主要介绍下Redis五大数据类型及其五大数据类型的相关操作. Redis支持五种数据类型 ...

  5. redis学习之——redis.conf配置(基本)文件学习

    # Redis configuration file example # Note on units: when memory size is needed, it is possible to sp ...

  6. Redis学习笔记~Redis主从服务器,读写分离

    回到目录 Redis这个Nosql的存储系统一般会被部署到linux系统中,我们可以把它当成是一个数据服务器,对于并发理大时,我们会使用多台服务器充当Redis服务器,这时,各个Redis之间也是分布 ...

  7. redis学习笔记-redis的安装

    Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择, ...

  8. Redis学习笔记-Redis内部数据结构

    Redis内部数据结构 Redis和其他key-value数据库的很大区别是它支持非字符串类型的value值.它支持的value值的类型如下: sds (simple dynamic string) ...

  9. python的字典数据类型及常用操作

    字典的定义与特性 字典是Python语言中唯一的映射类型. 定义:{key1: value1, key2: value2} 1.键与值用冒号“:”分开: 2.项与项用逗号“,”分开: 特性: 1.ke ...

  10. python的列表数据类型及常用操作

    列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. 列表可以进行的操作包括索 ...

随机推荐

  1. python3.5 continue和break 项目:买房分期付款(2)

    #案例:买房分期付款24万(10年期限) i=1#定义年份sum1=0while i<=10: print("第",i,"年到了......") if i ...

  2. adb-使用

    1.打印日志 adb logcat -v time > logname.txt adb logcat -v > logname.txt 2.删除手机缓存日志 adb logcat -c 3 ...

  3. 2020-04-20:对Java接口代理模式的实现原理的理解?

    静态代理Java中的静态代理要求代理类(ProxySubject)和委托类(RealSubject)都实现同一个接口(Subject).静态代理中代理类在编译期就已经确定,而动态代理则是JVM运行时动 ...

  4. Take C# 8.0 for a spin

    本文章为机器翻译.https://blogs.msdn.microsoft.com/dotnet/2018/12/05/take-c-8-0-for-a-spin/ 以C # 8兜风 我们昨天宣布Vi ...

  5. C#设计模式之17-中介者模式

    中介者模式(Mediator Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/419 访问. 中介者模式 ...

  6. Vue.js中传值给子部件及触发动作的问题

    最近研究一个用vue.js做的程序并修改增加功能.其中用到传值给子部件等问题. template中有个子部件: <template> ...... <child-form  v-if ...

  7. apache+djnago+websocket 部署配置

    部署Apache服务器 1.apache服务的安装这里不做赘述,因为网上一大堆. 链接:https://blog.csdn.net/qq_24394093/article/details/905501 ...

  8. JavaScript正则表达式的模式匹配教程,并且附带充足的实战代码

    JavaScript正则表达式的模式匹配 引言 正文 一.正则表达式定义 二.正则表达式的使用 三.RegExp直接量 (1)正则表达式初体验 (2)深入了解正则 字符类 重复 选择 分组与引用 指定 ...

  9. 计算机网络-传输层(1)UDP协议

    UDP协议基于Internet IP协议,只提供两个基础功能: 分用/复用 分用:主机接收到IP数据报(datagram),每个数据报携带源IP地址.目的IP地址且携带一个传输层的段(Segment) ...

  10. 第1篇 Scrum 冲刺博客

    每个成员在Alpha阶段认领的任务 钟智锋 内容 工时 客户端请求对局 1h 客户端请求移动/使用锦囊/技能/进化 1h 把对局信息转换成可传播的信息 2h 客户端通信 3h 编写博客和文档 1h 岑 ...