文章目录
Redis
redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。
redis安装后,在src和/usr/local/bin下有几个以redis开头的可执行文件,称为redis shell。
Redis执行命令 | 说明 |
---|---|
redis-server | 启动redis |
redis-cli | redis命令行工具 |
redis-benchmark | 基准测试工具 |
redis-check-aof | AOF持久化文件检测工具和修复工具 |
redis-check-dump | RDB持久化文件检测工具和修复工具 |
redis-sentinel | 启动redis-sentinel |
简述Redis的运行速度为何快?
- 基于内存操作,手动持久化到硬盘
- 高效数据结构,数据操作简单
- 单线程,避开多线程上下文切换的操作
- 多路I/O复用模型,非阻塞I/O
- 底层模型不同,底层实现方式及与客户端之间通信的应用协议不一样
- Redis直接自己构建了VM 机制 ,一般系统调用函数会浪费时间移动和请求
(一)五大数据类型
1、String-字符串
String的数据结构为简单动态字符串。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,最大value值为512M,可以包含任何数据,比如jpg图片(生成二进制)或者序列化的对象。
-
应用场景:计数场景,用户的访问次数、热点文章的点赞转发数量。
-
常用命令:
set,get,strlen,exists,dect,incr,setex
-
set
设置键值,使用get
获取,使用getset
命令获取当前键值并更新value值127.0.0.1:6379> set name zhangsan OK 127.0.0.1:6379> get name "zhangsan" 127.0.0.1:6379> getset name lisi "zhangsan" 127.0.0.1:6379> get name "lisi"
-
strlen
命令可获得当前键值对应value值的字节长度127.0.0.1:6379> strlen name (integer) 4
-
incr
命令可将 key 中储存的数字值增一,incrby
命令可将 key 中储存的数字增加任意数值127.0.0.1:6379> incr id (integer) 57 127.0.0.1:6379> incrby id 10 (integer) 67
-
decr
命令可将 key 中储存的数字值减一,decrby
命令可将 key 中储存的数字减少任意数值127.0.0.1:6379> decr id (integer) 66 127.0.0.1:6379> decr by id (integer) 56
-
exists
命令用于检查给定 key 是否存在,存在为1,不存在为0.127.0.0.1:6379> exists name (integer) 1 127.0.0.1:6379> exists na (integer) 0
-
setex
为指定的 key 设置值及其过期时间,ttl
命令查看当前时间127.0.0.1:6379> setex name 20 zhangsan OK 127.0.0.1:6379> get name "zhangsan" 127.0.0.1:6379> ttl name (integer) 11 127.0.0.1:6379> ttl name (integer) 3 127.0.0.1:6379> get name (nil)
-
setnx
在指定的 key 不存在时,为 key 设置指定的值。127.0.0.1:6379> setnx name lisi (integer) 1 127.0.0.1:6379> setnx name liwu (integer) 0
-
mset
命令设置多个键值对,mget
命令取多个键值。127.0.0.1:6379> mset name lisi sex nan OK 127.0.0.1:6379> mget name sex 1) "lisi" 2) "nan"
-
append
命令追加value值。127.0.0.1:6379> append name 123456789 (integer) 13 127.0.0.1:6379> get name "lisi123456789"
-
2、List-列表
链表是一种非常常见的数据结构,特点是易于数据元素的插入和删除并且且可以灵活调整链表长度,但是链表的随机访问困难。一个存储空间保存多个数据,且通过数据可以体现进入顺序。
-
应用场景: 发布与订阅、消息队列、慢查询。
-
常用命令:
rpush,lpop,lpush,rpop,lrange、llen
-
rpush
添加一个或多个值、lpush
在头部添加一个或多个值。127.0.0.1:6379> lpush people lida wanger zhangsan (integer) 3 127.0.0.1:6379> rpush people liqi wangba zhangjiu (integer) 6
-
lindex
获得指定索引的元素,lrange
获取指定范围的元素。127.0.0.1:6379> lindex people 2 "lida" 127.0.0.1:6379> lrange people 0 2 1) "zhangsan" 2) "wanger" 3) "lida"
-
lpop
移出并获取列表的第一个元素、rpop
移除并获取列表最后一个元素。127.0.0.1:6379> lpop people "zhangsan" 127.0.0.1:6379> rpop people "zhangjiu" 127.0.0.1:6379>
-
llen
获取当前长度127.0.0.1:6379> llen people (integer) 4
-
lrem
移除列表元素127.0.0.1:6379> lrem people 1 wanger (integer) 1 127.0.0.1:6379> lrange people 0 5 1) "lida" 2) "liqi" 3) "wangba"
-
ltrim
保留指定区间内的元素,移除其他所有元素127.0.0.1:6379> ltrim people 1 4 OK 127.0.0.1:6379> lrange people 0 10 1) "wanger" 2) "lisi" 3) "zhangsan" 4) "lida"
-
linsert
在列表的元素前或者后插入元素127.0.0.1:6379> linsert people before lisi lier (integer) 5 127.0.0.1:6379> lrange people 0 10 1) "wanger" 2) "lier" 3) "lisi" 4) "zhangsan" 5) "lida"
-
3、Hash-哈希
hash 类似于 JDK1.8 前的 HashMap,内部实现也差不多(数组 + 链表)。
hash 是一个 string 类型的 field 和 value 的映射表,特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。
-
应用场景:对象数据存储、电商网站购物车设计与实现。
-
常用命令:
hset,hmset,hexists,hget,hgetall,hkeys,hvals
-
hset
将哈希表 key 中的字段 field 的值设为 value 。hget
获取存储在哈希表中指定字段的值。127.0.0.1:6379> hset student name lisi (integer) 0 127.0.0.1:6379> hget student name "lisi"
-
hmset
将多个 field-value (域-值)对设置到哈希表 key 中、hmget
获取所有给定字段的值。127.0.0.1:6379> hmset student name zhangsan age 24 sex
-