Redis的入门|青训营

102 阅读8分钟

基础介绍

官方下载地址

redis命令参考

redis是一种key-value数据库,并提供多种语言的API。

启动Redis服务

使用redis-server启动服务端,redis-cliauth 密码启动客户端。使用ping检测 redis 服务是否启动。

image.png

如果redis-server报错Warning: no config file specified, using the default config. In order to specify a config file...... 使用如下命令解决

image.png

数据结构

redis是一种key-value数据库。

key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;key也不要太短,太短的话,key的可读性会降低;在一个项目中,key最好使用统一的命名模式,例如user:10000:passwd。

value支持五种数据类型,包含String、Hash、List、Set、Zset(SortedSet) 5种数据结构。

键的操作

EXPIRE key seconds 设置key过期时间,以秒为单位

TTL key获取key的过期时间

keys pattern查找有相应pattern的键,pattern是一个用于匹配键名的模式,支持通配符*和?。

exists key1 [key2 ...... keyN]判断键是否存在。对于每个键,存在为1,不存在为0。最后返回值为累加值。

type key获取key对应的value类型

del key1 [key2 ...... keyN]删除key及其value。返回被删除key的数量,如果指定的键不存在,则会被忽略

Strings

set key value设置键值对,返回1表示成功,0失败。

setex key seconds value设置键值及过期时间,以秒为单位。

setnx key value设置键值对,返回1表示设置成功,返回0表示key已经存在。

mset key1 value1 ...... keyN valueN批量添加键值对,成功返回1表示所有的值都设置了,失败返回0表示没有任何值被设置。

msetnx key1 value1 ...... keyN valueN批量添加键值对,成功返回1表示所有的值都设置了,失败返回0表示至少有一个给定键已经存在,不会设置任何key-value。

get key获取key对应的value,如果key不存在返回nil

getset key value先获取key的值,再设置key的值。如果key不存在返回nil,同时添加这对key-value。

mget key1 key2 ...... keyN一次获取多个key的值,如果对应key不存在,则返回数组的对应位置为nil

getrange key start end获取key相应索引的值。

incr key对key的值做++操作(value必须为int类型),并返回新的值。key不存在,则设置键值对,值为1。

decr key对key的值做--操作(value必须为int类型),并返回新的值。key不存在,则设置键值对,值为-1。

incrby key integer对key加上指定值,key不存在时候会设置key,并认为原来的value是0(加值前value是0,之后是integer)。

decrby key integer对key减去指定值,key不存在时候会设置key,并认为原来的value是0。

append key value把值追加到键现有值的末尾,key不存在时类似set操作。返回更新后的值长度。

strlen key获取值的长度(值类型必须为字符串)。如果不存在时,返回0。当key储存的不是字符串值时, 返回一个错误。

Hash

Redis的hash是一个string类型的键值的映射表,这里的值是一系列的field-value对,hash特别适合用于存储对象。 例如:student:id-100 name-tom age-15

hset key field value [field value ...]将field-value设置到key中。如果key不存在,则创建然后执行赋值;如果key下的field已经存在,则value值覆盖。返回设置成功的键值对个数。

hsetnx key field value将field-value设置到key中。如果field已经存在,则设置不成功,返回0;仅当field不存在,才能设置成功,返回1

hget key field获取 key 中给定域 field 的值。如果key不存在或者field不存在返回nil。

hmget key field [field…]获取 key 中多个给定域 field 的值。返回和field顺序对应的值,如果field不存在,对应位置返回nil。

hgetall key获取 key 中所有的域和值field-value。如果key不存在,返回空列表

hkeys key获取 key 中所有的域field。如果key不存在,返回空列表

hvals key获取 key 中所有的值value。如果key不存在,返回空列表

hlen key获取 key 中域的个数。key不存在返回0

hstrlen key field获取 key 中指定域的值的长度。如果key或者field不存在,返回 0

hdel key field [field…]删除 key 给定域 field,若field不存在则忽略。返回成功删除的数量

hexists判断 key 中,给定域 field 是否存在。如果field存在,返回1,否则返回0。

hincrby key field integer对key的指定field加上指定值,返回增加之后的field域的值。

hincrbyfloat key field float对key的指定field加上指定值,返回增加之后的field域的值。

List

redis列表类型的数据一个key对应多个value,value间有顺序。操作总的思想是通过key和下标操作value。正序下标递增,表头下标为0;逆序下标为负数,表尾下标为-1

lpush key value [value…]在头部依次插入数据,返回插入之后的列表的长度

rpush key value [value…]在尾部依次插入数据,返回插入之后的列表的长度

lset key index value设置指定索引的元素值。成功返回ok,key不存在或者index超出范围返回错误信息

linsert key before/after pivot value在pivot元素的前|后插入新元素value。key/pivot不存在时,忽略操作。成功返回新列表长度,pivot不存在返回-1, key不存在返回0。

lrange key start end返回存储在 key 的列表里指定范围内的元素

lindex key index返回列表里索引对应的元素

llen key返回key对应列表长度,key不存在返回0

lpop key移除头部第一个数据,并返回该数据。key不存在时,返回nil

rpop key移除尾部第一个数据,并返回该数据。key不存在时,返回nil

lrem key count value移除列表中与 value 相等的元素,移除个数由count值决定:count > 0,从列表的头部开始移除|count|个;count < 0, 从列表的尾部开始移除|count|个;count = 0移除表中所有与 value 相等的值。返回移除的元素个数

ltrim key start end裁剪列表,改为原集合的一个子集

Set

redis集合类型的数据一个key同样对应多个value,但是value间没有顺序,value也不能重复。操作总的思想是通过key确定集合,元素没有下标,将直接操作业务数据和数据的个数。

sadd key member [member…]添加元素,已经存在于集合的 member 元素将被忽略。返回新加入的member个数(不包括被忽略的元素)。

smembers key返回key集合所有的元素。key不存在,返回空集合。

scard key返回集合元素个数。key不存在,返回0

sismember key member判断元素是否在集合中,是则返回1,否则返回0

srandmember key [count]随机返回|count|个元素。没有提供了count时,默认返回一个元素;提供了count时,count > 0, 返回的元素各不重复。count < 0,返回的元素可能会重复多次。

srem key member [member…]移除集合中指定元素,不存在的元素被忽略。返回成功移除的member个数(不包括被忽略的元素)。

spop key [count]随机移除count个元素。返回被删除的元素,key不存在或空集合返回nil。

smove src dest member将元素从src集移动到dest集。src中member不存在,忽略操作返回0;dest已有member,则仅从src中删除member。成功返回1,否则返回0

sdiff key1 key2 [key3…]返回集合key1与其它集合的差集。即key1中有而其他集合都没有的元素。

sinter key key [key…]返回多个集合的交集

sunion key key [key…]返回多个集合的并集,如果元素有重复,则保留其中一个。

Zset(SortedSet)

redis有序集合是有序且不可重复的数据集合。有序集合的元素关联一个分数,redis会自动根据这个分数进行排序,默认按照分数从小到大进行排序,分数相同时则按照value的字典顺序排序。

zadd key score member [score member…]添加元素(score-member对)。返回新添加的元素个数。

incrby key integerscore member为元素添加分数。分数可为负数

zrange key start end [withscores]返回指定顺序范围内的元素(顺序的下标,0表示第一个元素——最小的元素),withscores选择是否一同返回score。逆序集合返回可用zrevrange

zrangebyscore key min max [withscores] [limit offset count]返回指定分数[min max]范围内的元素((用来表示开区间,例如20 (40表示分数区间为 [20 40) )。withscores选择是否一同返回score,limit用来指定返回结果的开始位置及数量,在结果集中从第offset个开始,取count个。逆序集合返回可用zrevrangebyscore

zrangebylex key min max [limit offset count]返回指定字典序(ASCII字符集的顺序)范围内的元素((用来表示开区间),可以使用-+表示得分最小值和最大值。

zcard key返回集合元素个数。key不存在,返回0

zcount key min max返回集合元素在分数[min max]区间的个数。

zrank key member返回指定member在集合中的排名(score最小的排名是0)。如果指定元素不存在,返回nil。返回逆序排名可用zrevrank

zscore key member返回指定member在集合中的分数

zrem key member [member…]移除集合中指定元素,不存在的元素被忽略。返回成功移除的member个数(不包括被忽略的元素)。

主从复制

一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。

流程可见Redis:主从复制

image.png

作用

数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。

负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

来源深入学习Redis:主从复制

redis用途

  • 缓存 Redis具有快速读写操作和高效的数据存储,适合用作缓存的存储层,能够缓存数据的计算结果、页面内容、数据库查询结果等。将经常访问的数据存储在Redis中,能够提高系统性能和响应速度。

image.png

  • 消息队列 基于消息传递机制,Redis可以作为一种高性能的消息队列使用,实现异步处理和解耦。可以将消息存储在队列(List、Pub/Sub、Stream)中,允许应用程序之间通过发布和订阅消息来进行通信,并且支持阻塞式操作,可以实现消息队列的等待和通知机制。了解堆栈以及push和pop就能轻松使用。

image.png SUBSCRIBE channel [channel ...]订阅指定的频道,接收发布到该频道的消息。PUBLISH channel message将消息发布到指定的频道。

  • 会话存储 Redis可以用于存储用户会话数据,可以保留数据,以便在缓存停止的情况下,在重新启动时,所有数据仍然存在。实现用户登录状态的跨设备、跨平台共享。

  • 分布式锁 基于Redis的锁机制,可以实现在分布式环境下对共享资源的互斥访问。在分布式系统中,多个节点同时访问同一个资源时,可能会出现相互干扰、重复更新等问题,分布式锁通过在Redis中设置一个特定的key来确保同一时间只有一个节点能够获取锁。具体原理可见一文搞定Redis分布式锁的实现和原理

image.png

  • 计数器和排行榜 Redis的原子操作和高性能使其非常适合处理计数器和排行榜等需要频繁更新和查询的情况。

  • 地理位置信息 Redis提供GEO(地理信息定位)功能,支持存储地理位置信息,适用于构建地理位置相关的应用。