Redis学习2:Redis的数据类型和常用操作
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的数据类型和常用操作的更多相关文章
- redis学习 (key)键,Python操作redis 键 (二)
# -*- coding: utf-8 -*- import redis #这个redis 连接不能用,请根据自己的需要修改 r =redis.Redis(host=") 1. delete ...
- Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝
一.运算符及优先级 Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 1.算数运算符 运算符 描述 实例,a=20,b=10 + 加 a+b输出结果30 - 减 a-b输出结果 ...
- Redis学习笔记--五种数据类型的使用场景
String 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...
- Redis五大数据类型的常用操作
在上一篇博文<centos安装redis>中,已经详细介绍了如何在centos上安装redis,今天主要介绍下Redis五大数据类型及其五大数据类型的相关操作. Redis支持五种数据类型 ...
- redis学习之——redis.conf配置(基本)文件学习
# Redis configuration file example # Note on units: when memory size is needed, it is possible to sp ...
- Redis学习笔记~Redis主从服务器,读写分离
回到目录 Redis这个Nosql的存储系统一般会被部署到linux系统中,我们可以把它当成是一个数据服务器,对于并发理大时,我们会使用多台服务器充当Redis服务器,这时,各个Redis之间也是分布 ...
- redis学习笔记-redis的安装
Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择, ...
- Redis学习笔记-Redis内部数据结构
Redis内部数据结构 Redis和其他key-value数据库的很大区别是它支持非字符串类型的value值.它支持的value值的类型如下: sds (simple dynamic string) ...
- python的字典数据类型及常用操作
字典的定义与特性 字典是Python语言中唯一的映射类型. 定义:{key1: value1, key2: value2} 1.键与值用冒号“:”分开: 2.项与项用逗号“,”分开: 特性: 1.ke ...
- python的列表数据类型及常用操作
列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. 列表可以进行的操作包括索 ...
随机推荐
- python2.5项目:个税计算器程序
#开发个税计算器:应纳税所得额=工资收入金额-各项社会保险费-起征点(5000元)应纳税额=应纳税所得额*税率—速算扣除数(税率参考图片)m=float(input("请输入你的税前工资:& ...
- Python爬取招聘网站数据,给学习、求职一点参考
1.项目背景 随着科技的飞速发展,数据呈现爆发式的增长,任何人都摆脱不了与数据打交道,社会对于“数据”方面的人才需求也在不断增大.因此了解当下企业究竟需要招聘什么样的人才?需要什么样的技能?不管是对于 ...
- 用python写网路爬虫 PDF高清完整版免费下载 Python基础教程免费电子书 python入门书籍免费下载
<用python写网路爬虫PDF免费下载>PDF书籍下载 内容简介 作为一种便捷地收集网上信息并从中抽取出可用信息的方式,网络爬虫技术变得越来越有用.使用Python这样的简单编程语言,你 ...
- 修改 jar 包 或 war 包内容
修改 jar 包 或 war 包内容 有一个 java web 项目,是 .jar 或 .war 文件,我想替换其中的部分样式(.css)或功能(.class). 步骤就是解压,替换,重新打包. 以 ...
- 2020-07-22:你觉得使用redis的主从复制的时候有什么点需要注意的吗?
福哥答案2020-07-22: 1.主从同步缓冲区设定大小,如果进行全量复制耗时太长,进行部分复制时发现数据已经存在丢失的情况,必须进行第二次全量复制,致使slave陷入死循环状态.在全量复制的时候, ...
- C#LeetCode刷题之#26-删除排序数组中的重复项(Remove Duplicates from Sorted Array)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3622 访问. 给定一个排序数组,你需要在原地删除重复出现的元素, ...
- MongoDB学习2:MongoDB的基本操作
以下都是基于MongoShell进行操作 1.使用insert进行插入操作 示例: db.<集合>.insertOne(<JSON对象>) db.<集合>.ins ...
- JS实现call,apply,bind函数
实现之前的预备知识 ...用作展开 ...用作剩余参数 Object.create()的作用 原型链与构造函数 这些有时间补上吧 call函数实现 Function.prototype.myCall ...
- win10下使用AIDA64建立副屏监控
写在前面: 最近刚攒了一台台式机,但是苦于没有太喜欢的温度监控插件,在贴吧里面看到有人用AIDA64做了一个副屏监控,感觉非常6,于是就开始了折腾之路. 需要的设备和软件: windows系统电脑一台 ...
- iNeuOS工业互联平台,WEB组态(iNeuView)集成rtmp和websocket视频元件,支持海康、大华等摄像头实时显示视频
目 录 1. 概述... 1 2. 平台演示... 2 3. 硬件摄像头... 2 4. 视频流协议转换管理... 2 5. 组态视频元件 ...