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. python2.5项目:个税计算器程序

    #开发个税计算器:应纳税所得额=工资收入金额-各项社会保险费-起征点(5000元)应纳税额=应纳税所得额*税率—速算扣除数(税率参考图片)m=float(input("请输入你的税前工资:& ...

  2. Python爬取招聘网站数据,给学习、求职一点参考

    1.项目背景 随着科技的飞速发展,数据呈现爆发式的增长,任何人都摆脱不了与数据打交道,社会对于“数据”方面的人才需求也在不断增大.因此了解当下企业究竟需要招聘什么样的人才?需要什么样的技能?不管是对于 ...

  3. 用python写网路爬虫 PDF高清完整版免费下载 Python基础教程免费电子书 python入门书籍免费下载

    <用python写网路爬虫PDF免费下载>PDF书籍下载 内容简介 作为一种便捷地收集网上信息并从中抽取出可用信息的方式,网络爬虫技术变得越来越有用.使用Python这样的简单编程语言,你 ...

  4. 修改 jar 包 或 war 包内容

    修改 jar 包 或 war 包内容 有一个 java web 项目,是 .jar 或 .war 文件,我想替换其中的部分样式(.css)或功能(.class). 步骤就是解压,替换,重新打包. 以 ...

  5. 2020-07-22:你觉得使用redis的主从复制的时候有什么点需要注意的吗?

    福哥答案2020-07-22: 1.主从同步缓冲区设定大小,如果进行全量复制耗时太长,进行部分复制时发现数据已经存在丢失的情况,必须进行第二次全量复制,致使slave陷入死循环状态.在全量复制的时候, ...

  6. C#LeetCode刷题之#26-删除排序数组中的重复项(Remove Duplicates from Sorted Array)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3622 访问. 给定一个排序数组,你需要在原地删除重复出现的元素, ...

  7. MongoDB学习2:MongoDB的基本操作

    以下都是基于MongoShell进行操作 1.使用insert进行插入操作  示例: db.<集合>.insertOne(<JSON对象>) db.<集合>.ins ...

  8. JS实现call,apply,bind函数

    实现之前的预备知识 ...用作展开 ...用作剩余参数 Object.create()的作用 原型链与构造函数 这些有时间补上吧 call函数实现 Function.prototype.myCall ...

  9. win10下使用AIDA64建立副屏监控

    写在前面: 最近刚攒了一台台式机,但是苦于没有太喜欢的温度监控插件,在贴吧里面看到有人用AIDA64做了一个副屏监控,感觉非常6,于是就开始了折腾之路. 需要的设备和软件: windows系统电脑一台 ...

  10. iNeuOS工业互联平台,WEB组态(iNeuView)集成rtmp和websocket视频元件,支持海康、大华等摄像头实时显示视频

    目       录 1.      概述... 1 2.      平台演示... 2 3.      硬件摄像头... 2 4.      视频流协议转换管理... 2 5.      组态视频元件 ...