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,依此类推. 列表可以进行的操作包括索 ...
随机推荐
- python3.6项目:银行存取款系统
card1 ="1001"#卡号pwd1="1001"#密码ban1=10000#余额card2 ="1002"pwd2="100 ...
- jQuery 综合练习ToDoList
<div class="header"> <section> <label for="">ToDoList</labe ...
- AndroidStudio新建项目报错build failed
AndroidStudio新建项目报错build failed 报错信息 org.gradle.initialization.ReportedException: org.gradle.interna ...
- JavaScript基础-03
1. 条件判断语句 若条件成立才会执行,条件不成立则语句不执行: if语句 语法一: if(条件表达式) {语句} :true就执行,false不执行: 语法二: if(条件表达式) ...
- 浏览器自动化的一些体会9 访问angular页面的一个问题
发现浏览器自动化有一个重要方面没有提及,即所谓的无页面浏览器,不过最近没有需求,不想尝试,先记上一笔,以后有需求时,可以有个思路. 大约一两个月前(现在比较懒散,时间不知不觉过去,连今天是几号有时候都 ...
- 使用Postman工具做接口测试(五)——生成随机参数
引言 我们平时使用最多的接口调试工具就是postman了,比如开发将一个接口给到你,你想看看接口是否正常.最常用的方法就是用postman去调一下.如果通,就写接口测试用例,反之,将开发打一顿吧o(* ...
- leetcode刷题记录——链表
使用java实现链表 单向链表 双向链表 单向循环链表 双向循环链表 题目记录 160.相交链表 例如以下示例中 A 和 B 两个链表相交于 c1: A: a1 → a2 c1 → c2 → c3 B ...
- 基于go+etcd实现分布式锁
原文链接:https://www.yii-china.com/topic/detail/113 package main import ( "context" "fmt& ...
- 算法-搜索(5)m路搜索树
动态m路搜索树即系统运行时可以动态调整保持较高搜索效率的最多m路的搜索树.以3路搜索树为例说明其关键码排序关系: const int MaxValue=; template <class T ...
- Federated Optimization for Heterogeneous Networks
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:1812.06127v3 [cs.LG] 11 Jul 2019 目录: Abstract 1 Introduction 2 ...

