Redis开发指南

2021-12-28 11:14:00 浏览数 (1)

Redis介绍

Redis是内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。

优势是:

  • 支持多种类型的数据结构
    • 字符串(strings)
    • 散列(hashes)
    • 列表(lists)
    • 集合(sets)
    • 有序集合(sorted sets)
    • 位图(bitmaps)
    • 地理空间(geospatial
  • 默认的可用性和可靠性保障
    • 复制(replication)
    • LUA脚本(Lua scripting)
    • LRU事件驱动(LRU eviction)
    • 事物(transactions)
    • 持久化(persistence)
    • 哨兵(Sentinel)
    • 自动分区(Cluster)

Redis命令相关

redis命令参考

开发常用命令介绍:

key(键)

代码语言:javascript复制
# 查看当前key的数量
# (如果不知道key的规模的话不建议直接使用keys *,这样会遍历所有的key,可能造成阻塞)
127.0.0.1:6379> keys *
1) "books"
2) "name"

# 判断一个可以是否存在(返回1表示存在)
127.0.0.1:6379> EXISTS name
(integer) 1

# 删除key(返回1表示删除成功)
127.0.0.1:6379> del name
(integer) 1


# 设置key的过期时间(过期时间为50s)
127.0.0.1:6379> EXPIRE books 50
(integer) 0
# EXPIREAT 命令是指定时间戳为过期时间的

# 查看过期时间(过期时间到了之后key会自动删除)
127.0.0.1:6379> TTL books
(integer) 32

# 移除key的过期时间
127.0.0.1:6379> PERSIST books
(integer) 1

# 随机获取一个key
127.0.0.1:6379> RANDOMKEY
"books"

# 查看key的类型
127.0.0.1:6379> type books
string

# 增量迭代一集元素
# (推荐使用这种方式去迭代查找key,因为keys和smembers命令会在处理大数据或者一个大的集合键的时候造成服务器严重阻塞)
# scan 命令是一个基于游标的迭代器(cursor based iterator): SCAN 命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。
# 对应的其他命令sscan(set),zscan(zset),hscan(hash)

127.0.0.1:6379> scan 0
1) "0"
2) 1) "sex"
   2) "books"
   3) "name"
   4) "id"

String(字符串)

代码语言:javascript复制
# 设置简单的字符串k/v,并获取数据
127.0.0.1:6379> set url "xxbandy.github.io"
OK
127.0.0.1:6379> get url
1) "xxbandy.github.io"

# 批量存储数据
127.0.0.1:6379>mset name "biaoge" url "xxbandy.github.io"
127.0.0.1:6379> mget name url
1) "biaoge"
2) "xxbandy.github.io"

# 设置key时并设置过期时间(ex为秒,px为毫秒)
127.0.0.1:6379> set name "biaoge" ex 100
OK
127.0.0.1:6379> ttl name
(integer) 95
127.0.0.1:6379> ttl name
(integer) 90

# 追加字符串(必须是字符串)
127.0.0.1:6379> append name "--biao"
(integer) 12
127.0.0.1:6379> get name
"biaoge--biao"


# bitmap 实现计数(setbit和bitcount的使用)
# 举个例子,如果今天是网站上线的第 100 天,而用户 peter 在今天阅览过网站,那么执行命令 SETBIT peter 100 1 ;如果明天 peter 也继续阅览网站,那么执行命令 SETBIT peter 101 1 ,以此类推

# setbit key offset value 对key所存储的字符串值设置或者清楚指定偏移量上的bit(所以value是0或者1)。字符串key会进行自动伸展,以确保可以jiang value保存在指定的偏移量上。

# 使用bitmap进行简单的计数(biaoge=111)
127.0.0.1:6379> SETBIT biaoge 0 1
(integer) 0
127.0.0.1:6379> SETBIT biaoge  1 1
(integer) 0
127.0.0.1:6379> SETBIT biaoge 2 1
(integer) 0


# bitop用来对bitmap进行相关的元操作(逻辑并与或,逻辑非与逻辑异域)
# biao=1100 biao1=1011 
127.0.0.1:6379> SETBIT biao 1 0
(integer) 0
127.0.0.1:6379> SETBIT biao 2 1
(integer) 0
127.0.0.1:6379> SETBIT biao 3 1
(integer) 0
127.0.0.1:6379> SETBIT biao1 0 1
(integer) 0
127.0.0.1:6379> SETBIT biao1 1 1
(integer) 0
127.0.0.1:6379> SETBIT biao1 2 0
(integer) 0
127.0.0.1:6379> SETBIT biao1 3 1
(integer) 0

# result=1000(求交集)
127.0.0.1:6379> BITOP and result biao biao1
(integer) 1
127.0.0.1:6379> GETBIT result 0
(integer) 0
127.0.0.1:6379> GETBIT result 1
(integer) 0
127.0.0.1:6379> GETBIT result 2
(integer) 0
127.0.0.1:6379> GETBIT result 3
(integer) 1
127.0.0.1:6379>
# result=1111(并集)
127.0.0.1:6379> BITOP or result1 biao biao1
(integer) 1
127.0.0.1:6379> GETBIT result1 0
(integer) 1
127.0.0.1:6379> GETBIT result1 1
(integer) 1
127.0.0.1:6379> GETBIT result1 2
(integer) 1
127.0.0.1:6379> GETBIT result1 3
(integer) 1



# bitcount key [start] [end] 计算给定字符串中,被设置为1的比特位的数量(计数的场景)
127.0.0.1:6379> BITCOUNT biaoge
(integer) 3

注意:setbit类型的offset参数必须大于等于0,且小于2的32次方(限制在512M)

代码语言:javascript复制
# 将key中存储的数值增加1
127.0.0.1:6379> set op 1
OK
127.0.0.1:6379> INCR op
(integer) 2
127.0.0.1:6379> INCR op
(integer) 3
127.0.0.1:6379> INCR op
(integer) 4
127.0.0.1:6379> INCR op
(integer) 5
127.0.0.1:6379> get op
"5"

# 通常情况下,incr可以被用在计数器和限速器里面,在golang里面需要借助timer和ticker和相关的channel知识来实现。
# 如下简单示例可以表示biaoge用户在一天的操作量
127.0.0.1:6379> set biaoge::2018.04.08 1
OK
127.0.0.1:6379> INCR biaoge::2018.04.08
(integer) 2
127.0.0.1:6379> INCR biaoge::2018.04.08
(integer) 3
127.0.0.1:6379> get biaoge::2018.04.08
"3"

注意1:可以通过使用incr和expire来达到只在规定的生存时间内进行计数的目的

注意2:可以通过getset命令原子性地获取计数器的当前值并将计数器清零 注意3:可以使用其他自增和自荐操作改变计数器的值(decr和incrby)

Hash(哈希表)

代码语言:javascript复制
# 创建一个hash类型的key/value
127.0.0.1:6379> hset website name "biaoge"
(integer) 1
127.0.0.1:6379> hset website url "xxbandy.github.io"
(integer) 1

# 批量更新hash的value(同时设置多个value)
127.0.0.1:6379> HMSET website id "1" desc "It"
OK

# 获取hash类型的所有值
127.0.0.1:6379> HGETALL website
1) "name"
2) "biaoge"
3) "url"
4) "xxbandy.github.io"
5) "id"
6) "1"
7) "desc"
8) "It"

# 批量获取多个指定的域
127.0.0.1:6379> hmget website name id
1) "biaoge"
2) "1"

# 获取单个指定域
127.0.0.1:6379> HGET website name
"biaoge"

# 查看hash表key中的所有域,以及域长度
127.0.0.1:6379> HKEYS website
1) "name"
2) "url"
3) "id"
4) "desc"
127.0.0.1:6379> hlen website
(integer) 4

# 删除哈希表中的某个域
127.0.0.1:6379> HDEL website id
(integer) 1

# 查看哈希表中的域是否存在
127.0.0.1:6379> HEXISTS website id
(integer) 0
127.0.0.1:6379> HEXISTS website name
(integer) 1

List(列表)

代码语言:javascript复制
# 向列表中增加元素
127.0.0.1:6379>
127.0.0.1:6379> LPUSH update 0407 0408
(integer) 2
127.0.0.1:6379> LPUSH update 0409
(integer) 3

# 使用lrange获取范围元素
127.0.0.1:6379> LRANGE update 0 -1
1) "0409"
2) "0408"
3) "0407"

# 查看列表长度
127.0.0.1:6379> LLEN update
(integer) 3

# 指定列表的索引获取元素
127.0.0.1:6379> LINDEX update 0
"0409"
127.0.0.1:6379> LINDEX update 1
"0408"

# 向列表中的某个元素的相对位置进行插入元素(LINSERT key BEFORE|AFTER pivot value)
127.0.0.1:6379> RPUSH mylist "Hello"
(integer) 1
127.0.0.1:6379> RPUSH mylist "World"
(integer) 2
127.0.0.1:6379> LINSERT mylist BEFORE "World" "There"
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"

# 移除并返回key的头元素或尾元素
127.0.0.1:6379> LPOP mylist
"Hello"
127.0.0.1:6379> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"
4) "xxb"
127.0.0.1:6379> rpop mylist
"xxb"
127.0.0.1:6379> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"

Set(集合)

set集合的好处就是默认会自动去重且排序

代码语言:javascript复制
# 追加多个元素到集合中
127.0.0.1:6379> SADD numset 1  2 12 3 4 4 5 12 23
(integer) 7
# 获取集合类型的全部值
127.0.0.1:6379> SMEMBERS numset
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "12"
7) "23"

# 查看集合的元素个数
127.0.0.1:6379> SCARD numset
(integer) 7

# 多个集合的交集(sinter)
127.0.0.1:6379> SMEMBERS numset
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "12"
7) "23"
127.0.0.1:6379> SMEMBERS numset1
1) "2"
2) "4"
3) "12"
4) "32"
5) "45"
127.0.0.1:6379> SINTER numset numset1
1) "2"
2) "4"
3) "12"

# smove迁移一个集合元素到另外一个集合

# 移除并返回集合中的随机数
127.0.0.1:6379> SPOP numset
"3"

注意:遍历元素建议使用sscan

SortedSet(有序集合) 有序集合会根据设置时的顺序保持集合的有序性。

代码语言:javascript复制
# 向有序集合my_url中添加一个或者多个元素
127.0.0.1:6379> ZADD my_url 10 www.oschina.net
(integer) 1
127.0.0.1:6379> ZADD my_url 9 xxbandy.github.io 8 www.csdn.net 6 github.com
(integer) 3
# 获取有序集合的元素
127.0.0.1:6379> ZRANGE my_url 0 -1
1) "github.com"
2) "www.csdn.net"
3) "xxbandy.github.io"
4) "www.oschina.net"

# 获取有序集合的元素以及score
值
127.0.0.1:6379> ZRANGE my_url 0 -1 withscores
1) "github.com"
2) "6"
3) "www.csdn.net"
4) "8"
5) "xxbandy.github.io"
6) "9"
7) "www.oschina.net"
8) "10"

# 返回有序集合的元素个数
127.0.0.1:6379> ZCARD my_url
(integer) 4

# 查看指定score值区间内的成员数量
# 比如可以计算薪水或者成绩的相关区间人数
127.0.0.1:6379> ZRANGE my_url 0 -1 withscores
1) "github.com"
2) "6"
3) "www.csdn.net"
4) "8"
5) "xxbandy.github.io"
6) "9"
7) "www.oschina.net"
8) "10"
127.0.0.1:6379> ZCOUNT my_url 0 10
(integer) 4

# 获取有序集合中成员的score值(通过姓名获取对应的薪资)
127.0.0.1:6379> ZSCORE my_url www.oschina.net
"10"

注意:遍历有序集合可以使用zscan

Pub/Sub(发布订阅)

代码语言:javascript复制
# 发布消息(将信息message发送到指定的频道channel)
# publish channel message返回值为接收到信息message的订阅者梳理
# 比如0表示没有订阅者的频道
127.0.0.1:6379> PUBLISH biao "xxbandy.github.io"
(integer) 0


# 订阅一个或者多个符合给定模式的频道(psubscribe 和subscribe的区别是批量的关系)
127.0.0.1:6379> PSUBSCRIBE biao*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "biao*"
3) (integer) 1
# 如下信息为接收的发布者的消息(类型、模式、频道、消息内容)
1) "pmessage"
2) "biao*"
3) "biao"
4) "123"

# 查看活跃的订阅者以及订阅的客户端
client-3> PUBSUB NUMSUB news.it news.internet news.sport news.music
1) "news.it"    # 频道
2) "2"          # 订阅该频道的客户端数量
3) "news.internet"
4) "1"
5) "news.sport"
6) "1"
7) "news.music" # 没有任何订阅者
8) "0"
运维常用的相关命令

运维相关的文章

redis超时相关的文章

Connection(链接)

代码语言:javascript复制
# 查看并设置redis密码
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""
127.0.0.1:6379> config set requirepass test123

# 使用AUTH进行鉴权
127.0.0.1:6379> ping
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth test123
OK
127.0.0.1:6379> ping
PONG

# 查看并切换数据库
# 当前在db0
127.0.0.1:6379> info keyspace
# Keyspace
db0:keys=4,expires=0,avg_ttl=0
# 切换数据库
127.0.0.1:6379> select 1
OK

127.0.0.1:6379[1]> info keyspace
# Keyspace
db0:keys=4,expires=0,avg_ttl=0
127.0.0.1:6379[1]> set name xxbandy.github.io
OK
127.0.0.1:6379[1]> info keyspace
# Keyspace
db0:keys=4,expires=0,avg_ttl=0
db1:keys=1,expires=0,avg_ttl=0

Server(服务端)

代码语言:javascript复制
# 查看redis服务详情(包含server、client,memory,Persistence,Stats,Replication,CPU,Keyspace等相关信息)
127.0.0.1:6379> info
# info 命令也支持短命令方式指定信息集合
127.0.0.1:6379> info clients
# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
127.0.0.1:6379> info memory
# Memory
used_memory:809920
used_memory_human:790.94K
used_memory_rss:3891200
used_memory_peak:810632
used_memory_peak_human:791.63K
used_memory_lua:33792
mem_fragmentation_ratio:4.80
mem_allocator:jemalloc-3.2.0

# 查看客户端连接(client list)
127.0.0.1:6379> client list
addr=127.0.0.1:41412 fd=6 name= age=23236 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client

# 查看redis服务配置
127.0.0.1:6379> config get *
# 查看内存相关配置
127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "0"
127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "volatile-lru"

# 清空数据库(谨慎操作)
127.0.0.1:6379> flushall
127.0.0.1:6379> flushdb

# 查看redis的慢日志(慢日志取决于配置定义)
127.0.0.1:6379> config get slowlog-log-slower-than
1) "slowlog-log-slower-than"
2) "10000"
127.0.0.1:6379> config get slowlog-max-len
1) "slowlog-max-len"
2) "128"
# 没有超过10000微妙的操作,所以没有慢日志
127.0.0.1:6379> SLOWLOG get
(empty list or set)

0 人点赞