Redis学习笔记之基础命令

一. redis基础知识

select n # redis默认有16个数据库,此命令可以切换到对应的数据库,0~15
dbsize # 查看当前数据库的大小,与key的数量无关
127.0.0.1:6379> config get databases # 命令行查看数据库数量databases
1) "databases"
2) "16"
127.0.0.1:6379> select 8 # 切换数据库 DB 8
OK
127.0.0.1:6379[8]> dbsize # 查看数据库大小
(integer) 0
flushdb # 清空当前数据库中的键值对
flushall # 清空所有数据库的键值对

redis是基于内存操作的,且核心操作是单线程的,所以redis的性能瓶颈不是CPU而是机器的内存和网络带宽

redis QPS可达每秒10w+

核心:Redis是将所有的数据放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作!),对于内存系统来说,如果没有上下文切换效率就是最高的,多次读写都是在一个CPU上的,在内存存储数据情况下,单线程就是最佳的方案。

二. benchmark redis性能测试工具

redis-benchmark -h localhost -p 6379 -c 100 -n 100000
# 测试100个并发连接100000请求

参数:

-h # 指定服务器主机名
-p # 端口
-s # 指定服务器socket
-c # 指定并发连接数
-n # 指定请求数
-d # 以字节的形式指定set/get值的数据大小
-k # 1是keep alive 0是reconnect
-r # set/get/incr 使用随机的key,sadd使用随机值
-p # 通过管道传输请求
-q # 强制退出redis,仅显示query/sec值
--csv # 以csv格式输出
-t #仅运行逗号分隔的测试命令

二. redis五大数据类型

Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。

1. Redis-key

在redis中无论什么数据类型,在数据库中都是以key-value形式保存,通过进行对Redis-key的操作,来完成对数据库中数据的操作

exists key # 判断键是否存在
del key # 删除键值对
move key db # 将键值对移动到指定的数据库
expire key second # 设置键值对的过期时间
type key # 查看value的数据类型
ttl key # 查看过期剩余时间

TTL命令:

当key没有设置过期时间,返回-1

当key设置过期时间且已过期,返回-2

当key设置了过期时间且未过期,返回key的剩余时间

RENAME 和RENAMENX

rename key newkey 修改key的名称

renamenx key newkey 仅当newkey不存在时将key改名为newkey

2. String
set key value # 设置键值对

get key # 获得key对应的value

append key value # 向指定的key追加value

decr key # 将指定的key的value自减1

incr key # 将指定的key的value自增1

decrby key n # 将指定的key按步长n自减

incrby key n # 将指定的key按步长n自增

incrbyfloat key 5.21 # 为数值加上浮点型数值

strlen key # 获取key对应字符串的长度

getrange key start end # 截取字符串(左右均为闭合)

setrange key offset value # 用指定的value替换key中offset开始的值

getset key value # 将key的值设置为value并返回旧的值

setnx key value # 仅当key不存在时添加键值对

setex key seconds value # set键值并设置过期时间

mset k1 v1 k2 v2 k3 v3 # 批量设置

msetnx k1 v1 k2 v2 k3 v3 # 批量设置仅当所有的key都不存在时

mget k1 k2 k3 # 批量获取key值

psetex key milliseconds value # 以毫秒为单位设置key过期时间

使用场景: 计数器, 统计多单位的数量, 对象缓存

3. List

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)

lpush key value [...] # 从左边向列表中添加值(一个或多个)

rpush key value [...] # 从右边向列表中添加值(一个或多个)

lpushx key value [...] # 从左边向已存在的列表添加一个或多个值

rpushx key value [...] # 从右边向已存在的列表添加一个或多个值

linsert key before|after point value # 向指定列表point元素的前面或后面插入值

llen key # 查看列表长度

lindex key index # 通过索引获取列表元素

lset key index value # 通过索引为元素设值

lpop\rpop key # 从左边或右边移除值并返回

rpoplpush source destination # 将列表的尾部值弹出并返回,然后添加到另一个列表的尾部

ltrim key start end # 指定下标范围截取列表元素

lrem key count value # 从头部开始删除值为value的元素,最多删除count个

blpop/brpop key [...] timeout # 移除并获得列表的第一个/最后一个元素,若没有元素会阻塞列表直到超时或发现可弹出元素为止

brpoplpush source destination timeout # 和rpoplpush功能相同,没有元素会阻塞队列至超时或有元素可弹出

list实际上是一个链表

如果key不存在,则创建新的链表

如果key存在,新增内容

如果移除了所有值,空链表,也代表不存在

在两边插入或者改动值,效率最高!修改中间元素,效率相对较低

使用场景: 消息队列,消息排队,栈

4. Set

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)

sadd key menber [...] # 向无序集合中添加一个或多个成员

scard key # 获取集合中成员数

smenbers key # 返回集合中所有成员

sismenber key menber # 查询menber元素是否是集合的成员

srandmenber key [count] # 随机返回集合中的一个或count个成员

spop key [count] # 随机移除集合中的一个或count个成员并返回

smove source destination member # 将source中的menber移到destination中

srem key menber [...] # 移除集合中的成员

sdiff key1 [key2...] # 返回所有结合的差集

sdiffstore destination key1 [key2...] # 在sdiff的基础上将结果保存至集合中

sunion key [key2...] # 返回所有集合的并集

sunionstore destination key1 [key2...] # 在sunion的基础上将结果保存到集合中

sscan key cursor [match] [count]

#在redis中对于一个集合类,也就是除了string以外的list hash set zset这些集合类,如果里面的元素很多,此时调用del key命令就可能会阻塞很长时间,一个解决办法是多次删除,每次只删一部分。那么怎么才能多次删除?这里以set为例
sadd setkeymxz a01 a02 a03 a04 a05 a05 b02 b03 b04 b05
sscan setkeymxz 0 MATCH a* COUNT 2
1) "2"
2) 1) "a01"
   2) "a02"
redis对于该命令作用顺序是先执行count,再从结果集中找模式匹配的解决
先找出来count个结果,再从结果中找出匹配的
5. Hash

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

Set就是一种简化的Hash,只变动key,而value使用默认值填充。可以将一个Hash表作为一个对象进行存储,表中存放对象的信息。

hset key field value # 将哈希表key中的field字段的值设置为value,重复设置同一个field会覆盖,返回0;

hmset key filed value [f1 v1 f2 v2 ...] # 同时设置多个键值对

hsetnx key field value # 只有字段field不存在时设置该字段的值

hexists key field # 哈希表key中是否存在field字段

hget key field # 获取哈希表key中field字段的值

hmget key filed [f1 f2 f3 ...] # 获取多个字段的值

hgetall key # 获取哈希表中所有的字段和值

hkeys key # 获取哈希表key中的所有的字段

hlen key # 获取哈希表中字段的数量

hvals key # 获取哈希表中所有字段的值

hdel key f1 [f2 ...] # 删除哈希表中的一个或多个字段

hincrby key field n # 为字段field增加n,并返回增加后的结果,只适用于整数型字段

hincrbyfloat key field n # 为浮点型字段field增加n

hscan key cursor [match pattern] [count count] # 迭代key哈希表,cursor-游标,pattern-匹配模式,count-数量
6. Zset

有序的set,与set相似,但是每个元素都会关联一个double类型的score,redis通过score对集合中的成员从小到大进行排序,当score相同时按字段顺序排序,集合中的成员唯一的但是score可以重复

zadd key score menber1 [s2 m2 s3 m3 ...] # 向有序集合添加一个或多个成员,已存在的成员更新其score

zcard key # 获取有序集合的成员数

zcount key min max # 计算在有序集合中指定区间score的成员数

zincrby key n menber # 给有序结集合中指定的menber的score加上n

zscore key menber # 返回menber的score

zrank key menber # 返回menber的索引

zrange key start end # 返回指定索引区间中的成员

zrangebylex key min max # 通过字典区间返回有序集合的成员

zrangebyscore key min max # 通过分数返回有序集合指定区间

zlexcount key min max # 指定字典区间内的成员数量

zrem key menber [m2 m3 ...] # 移除一个或多个元素

zremrangebylex key min max  # 移除指定字典区间的成员

zremrangebyrank key start stop # 移除指定排序区间内的所有成员

zremrangebyscore key min max # 移除指定分数区间的所有成员

zlexcount key min max # 计算指定字典区间的成员数量

zrem key member [m1 m2 ...] # 移除有序集合中一个后多个成员

zrmrangebylex key min max # 移除指定字典区间内的所有成员

remrangebyrank key start stop # 移除指定排名区间的所有成员

remrangebyscore key min max # 移除指定score区间的所有成员

zrevrange key start end # 返回指定索引区间内的成员,分数从高到低排序

zrevrangebyscore key max min # 返回指定分数区间内的成员,按分数降序

zrevrangebylex key max min # 返回有序集中指定字典区间内的成员,按字典顺序倒序

zrevrank key menber #返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序

zinterstore destianation numkeys key1 [key2 key3 ...] # 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中,numkeys:表示参与运算的集合数,将score相加作为结果的score

zunionstore destination numkeys key1 [key2 ...] # 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中

zscan key cursor [match pattern] [count count] # 迭代有序集合中的元素(包括元素成员和元素分值)

三. 三种特殊数据类型

1. Geospatial(地理位置)

使用经纬度定位地理坐标并用一个有序集合zset保存,所以zset命令也可以使用

geoadd key longitud(经度) latitude(纬度) menber [...] #将一个地点的经纬度存入一个有序集合

geopos key menber [...] # 获取一个或多个成员的坐标

geodist key menber1 menber2 [unit] # 返回两个坐标的距离,默认单位为米 uinit[m表示米, km表示千米, mi表示英里, ft表示英尺]

georadius key longitude latitude radius m[km|mi|ft] [WITHCOORD][WITHDIST] [WITHHASH] [COUNT count] # 以给定的经纬度为中心, 返回集合包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。

georadiusbymember key member radius m[km|mi|ft] [WITHCOORD][WITHDIST] [WITHHASH] [COUNT count] # 与georadius相似but中心点是集合中的元素

geohash key member1 [member2..] # 返回一个或多个位置元素的Geohash表示。使用Geohash位置52点整数编码

# 有效的经度从-180度到180度。
# 有效的纬度从-85.05112878度到85.05112878度
2. HyperLogLog(基数统计)

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。底层使用string数据类型

pfadd key element1 [el1 el2 ...] # 添加指定元素到HyperLogLog中

pfcount key [...] # 返回给定HyperLogLog的基数的估算值

pfmerge destkey sourcekey [sourcekey...] # 将多个HyperLogLog合并为一个HyperLogLog

应用场景: 记录访问量等

3. BitMaps(位图)

位图使用位存储,信息的状态只有0或者1

setbit key offset value # 为指定的key的offset

getbit key offset # 获取指定offset的值

bitcount key [start end] # 统计字符串被设置为1的bit数,也可以指定统计范围按字节

bitop operration destkey key[key..] # 对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上

bitops key bit [start end] # 返回字符串里面第一个被设置为1或者0的bit位。start和end只能按字节,不能按位

四. 事务

redis单条命令是保证原子性的但是redis事务不能保证原子性

事务操作
multi # 开启事务
命令入队 ...
exce # 执行事务
discurd # 取消事务
事务错误
  • 代码语法错误,所有的命令都不执行

    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set k1 v1
    QUEUED
    127.0.0.1:6379> set k2 v2
    QUEUED
    127.0.0.1:6379> error k1 # 语法错误命令
    (error) ERR unknown command `error`, with args beginning with: `k1`,
    127.0.0.1:6379> get k2
    QUEUED
    127.0.0.1:6379> EXEC
    (error) EXECABORT Transaction discarded because of previous errors. # 执行报错
    127.0.0.1:6379> get k1 
    (nil)
    
  • 代码逻辑错误,即运行时异常, 其他命令可以正常运行

    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set k1 v1
    QUEUED
    127.0.0.1:6379> set k2 v2
    QUEUED
    127.0.0.1:6379> INCR k1 # 命令逻辑错误
    QUEUED
    127.0.0.1:6379> get k2
    QUEUED
    127.0.0.1:6379> exec
    1) OK
    2) OK
    3) (error) ERR value is not an integer or out of range # 运行报错
    4) "v2"
    
watch实现乐观锁操作
watch key # 监视某个key
unwatch # 解锁

五. redis.conf配置文件


内存单位的表示
 
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 10241024 bytes
# 1g => 1000000000 bytes
# 1gb => 10241024*1024 bytes
 
单位中不区分大小写1GB 1Gb 1gB是一样的
 
后台运行,yes是后台运行,no前台运行,将输出,输出到终端(默认)
 
daemonize yes
 
如果daemonize参数为yes的话就会产生pid文件,一下是pid文件的定义
 
pidfile /usr/local/redis-master/run/redis.pid
 
监听的端口
 
port 6379
 
绑定监听的IP地址
 
bind 127.0.0.1
 
如果在本地调用redis可以直接用sock文件
 
unixsocket /tmp/redis.sock //sock文件的位置
 
unixsocketperm 755      //sock文件的权限
 
如果一个链接在N秒内是空闲的,就将其关闭
 
timeout 0
 
如果对方down了或者中间网络断了发送ACK到客户端在指定的时间内没有收到对方的回应就断开TCP链接(时间单位秒记),此参数会受到内核参数的影响,推荐配置60。
 
tcp-keepalive 0
 
指定输出消息的级别
 
# debug (调试级别,详细信息,信息量大)
# verbose (详细信息,信息量较大)
# notice (通知,生产环境推荐)
# warning (错误信息警告信息)
 
loglevel notice
 
日志输出文件,默认在前端运行的时候此key的默认值是stdout输出到终端,如果用守护进程运行此key的stdout的时候将日志输入到/dev/null,如果想记录日志,就必须为其指定logfile位置
 
logfile /var/log/redis.log
 
将日志记录的哦syslog
 
syslog-enabled no
 
指定syslog的身份
 
syslog-ident redis
 
指定syslog的级别,必须是LOCAL0-LOCAL7之间
 
syslog-facility local0
 
设置数据库的数量
 
databases 16
 
设置数据库的数量。默认数据库DB 0,你可以选择一个不同的per-connection的使用SELECT<dbid>这儿的DBID是一个介于0和'databases'-1
 
databases 16
 
2.快照配置
 
将DB保存到磁盘的规则定义(快照)
 
格式:save <seconds> <changes>
 
例子:save 900 1 //在900秒(15分钟)内如果至少有1个键值发生变化 就保存
 
      save 300 10 //在300秒(6分钟)内如果至少有10个键值发生变化 就保存 
save 900 1           //每一条表示一个存盘点
save 300 10
save 60 10000
 
如果启用如上的快照(RDB),在一个存盘点之后,可能磁盘会坏掉或者权限问题,redis将依然能正常工作
 
stop-writes-on-bgsave-error yes
 
是否将字符串用LZF压缩到.rdb 数据库中,如果想节省CPU资源可以将其设置成no,但是字符串存储在磁盘上占用空间会很大,默认是yes
 
rdbcompression yes
 
rdb文件的校验,如果校验将避免文件格式坏掉,如果不校验将在每次操作文件时要付出校验过程的资源新能,将此参数设置为no,将跳过校验
 
rdbchecksum yes
 
转储数据的文件名
 
dbfilename dump.rdb
 
redis的工作目录,它会将转储文件存储到这个目录下,并生成一个附加文件
 
dir /usr/local/redis-master/db
 
3.主从参数
如果本地是salve服务器那么配置该项
 
# slaveof <masterip> <masterport>
 
slaveof 127.0.0.1 65532
 
master的验证密码
 
masterauth <master-password>
 
当从主机脱离主的链接时,如果此值为yes当客户端查询从时,回响应客户端,如果是第一次同步回返回一个日期数据或这空值,如果设置为no,则返回“SYNC with master in progress”到INFO and SLAVEOF
 
slave-serve-stale-data yes
 
从服务器只读(默认)
 
slave-read-only yes
 
从发送ping到主的时间间隔(单位:秒)
 
repl-ping-slave-period 10
 
批量传输I / O超时和主数据或ping响应超时 默认60s 必须大于repl-ping-slave-period值
 
repl-timeout 60
 
此选项如果是“yes”那么Redis的使用数量较少的TCP数据包和更少的带宽将数据发送到,在从主机上延迟40毫秒(linux kernel中的40毫秒)出现。如果是no将在slave中减少延迟,但是流量使用回相对多一些,如果用多个从主机,此处建议设置成yes
 
repl-disable-tcp-nodelay no
 
从主机的优先级,如果当主主机挂了的时候,将从从主机中选取一个作为其他从机的主,首先优先级的数字最低的将成为主,0是一个特殊的级别,0将永远不会成为主。默认值是100.

六. 持久化操作

1. RDB方式

RDB方式会在指定时间内见数据写进磁盘,会单独创建一个线程forkl来执行持久化操作,会将数据写到一个临时文件,得到持久化操作完成后再用这个临时文件替换上次的持久化文件,整个过程中主进程不进行IO操作,确保了极高的性能,如果需要进行大规模的数据恢复且对数据完整性要求不高可以使用RDB方式,这方式比AOF高效,但是也有缺点,最后一次持久化后的数据可能会丢失,DRD方式保存的文件为dumb.rdb,只需要将此文件放入redis启动目录即可自动恢复数据

触发机制:save规则满足时会触发, flushdb时也会触发, 退出redis时也会触发

2.AOF方式

以日志的形式来记录每个写操作, 保存的文件是appendonly.aof redis重启时会根据这个文件来恢复数据,默认是不开启的,需要手动配置开启,将appendonly改为yes便开启了,如果aof文件受损,redis提供了修复的工具redis-check-aof --fix

优点: 每一次修改都会同步,完整性更好

缺点: aof文件远大于rdb文件,且修复速度也比RDB方式慢,运行效率也比RDB慢

七. 发布和订阅

publish 频道 消息内容  # 发布
subscribe 频道 [...] # 订阅一个或多个频道
subscribe 频道 [...] # 退订一个或多个频道
psubscribe p [p ...] # 订阅一个或多个频道

Redis 通过 PUBLISH、SUBSCRIBE 和 PSUBSCRIBE 等命令实现发布和订阅功能。
通过 SUBSCRIBE 命令订阅某频道后,redis-server 里维护了一个字典,字典的键就是一个个channel,而字典的值则是一个链表,链表中保存了所有订阅这个channel的客户端。SUBSCRIBE 命令的关键,就是将客户端添加到给定channel 的订阅链表中
通过 PUBLISH 命令向订阅者发送消息,redis-server会使用给定的频道作为键,在它所维护的channel 字典中查找记录了订阅这个频道的所有客户端的链表,遍历这个链表,将消息发布给所有订阅者。
Pub/Sub从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订说,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值