Redis.Note1

本文介绍了Redis的基本特性,包括其内存模型、持久化机制及作为数据库、缓存和消息队列的应用场景。此外还详细列举了Redis的各种命令,涵盖数据操作、键管理、事务处理以及发布订阅等功能,并对几种主要的数据结构进行了说明。

个人Redis默认port  6379

PID: 9251

 

1.Redis特点:专有的内存,不共享。

     持久化。

2.用途:作为DB,Cache,Queue三种用途。

 

 

3.从主流的说话上,Redis是单线程模型,但是不能说Redis完全是单线程模型的,Memcache是多线程模型的

 

 

4.系统级命令,不属于那个数据结构:

4.1 keys:用于模式匹配

keys pattern(* ? \e(这个代表匹配e) [abc](abc之间任意一个)等等)

 

 

4.2 exists key:判断指定的key是否存在

 

4.3 del:可以删除1个或多个键

 

4.4 type:返回键类型

 

4.5 randomkey:随机返回一个key

 

4.6 expire :如果你要做缓存,你一定要有一个过期时间

expire key seconds

为给定的key设置过期时间

 

expire nbme 6

(integer) 1

 get nbme

"jack"

get nbme

(nil)

 

4.7pexpire key 毫秒 作用与4.6相同

 

4.8expireat key timestamp(毫秒)某个具体时间过期

 

4.9pexpireat key timestamp(微秒)

 

4.10ttl: 返回我的key的生存时间(秒为单位)

 

4.11pttl :上同,单位是毫秒。

 

4.12sort:排序

 

4.13select 数字 切换数据库 redis里面有16个数据库

 

 

 

 

5.String类型:

  5.1数据最大容量是512MB

5.2赋值与取值:set/get

5.3incr key 递增(i++,++i) decr key递减

5.4incrby key increment 增加指定的整数  

  Decrby key decrement 减少指定的整数

5.5incrbyfloat 增加指定的浮点数

5.6append key value 向尾部追加值

5.7strlen key 获取字符串的长度

5.8mget mset 一次获得多个值或者设置多个值 减少带宽

mget msg name

1) "helloworld nihao"

2) "11"

5.9setrange

         getrange

GETRANGEmsg 6 10

SETRANGE msg 6 hahahaahaha

(integer) 17

get msg

"hellowhahahaahaha"

 

5.10setex key second value 赋值并加上过期时间

5.11getbit key offset获取二进制中offset这个位置的”0,1”状态

   Setbit key offset value 设置二进制中offset这个位置的”0,1”状态

   bicount key 获取二进制中1的个数

   Bitop operation 二进制位的操作(^ & |)

 

bit的妙用,可以统计上线天数(类似的问题),setbit xxx 100 1

最后再用bitcount xxx就可以获得上线天数

 

 

 

 

6.哈希在dictionary中的存储

Dictionary key: string类型 value=> dictionary

1. hset key field value   (keyredis中的key,fieldmap中的key)

2. hget key field

3. hmset key field value field value ->减轻网路带宽[高性能]

4. hmget

5. hgetall 遍历字典中的所有key/value

6. hexists 判断字典中的key是否存在

7. hsetnx  nx  = not exists 当字段不存在的时候赋值(原子性)

8. hincrby key field increment 增加

9. Hdel key field

10. hkeys key

   hvals key

11. hlen key

hash的优点:查找o(1)非常适合于定值查找

 

 

7.列表类型:

1.lpush key value 链表左端插入值

2.rpush key value 链表右端插入值

3.llen key 获取列表中元素的个数

4.lpop key

5.rpop key

6.lrange key start stop 获取列表片段 O(n)

7.lrem key count value

8.lrem key count value count>0从列表左边开始删前n个值为value的元素                count<0从列表右边开始删前n个值为value的元素

      count=0 删除所有值为value的元素

9.lindex key index 获得指定索引的元素值

10.lset key index value 设置指定索引的元素值

11.ltrim key start end可以删除指定索引范围之外的所有元素

12.linsert key before|after xxx value

13.rpoplpush 原列表 目标列表 使一个元素从原列表转移到目标列表 用来做数据迁移

 

 

8.集合类型:

8.1 sadd key member 添加元素到集合中

8.2 srem key member 删除集合中的元素

8.3 smembers key 显示集合所有元素

8.4sismember key member 判断元素是否在集合中

8.5集合间的运算:

sdiff key ... 差集

sinter key... 交集

sunion key... 并集

scard 获取集合中的元素个数

sdiffstore 目标集合 key...

sinterstore 目标集合 key...

sunionstore 目标集合 key...

8.6srandmember key [count] 随机获得集合中的元素

8.7spop key 从集合中弹出一个元素

 

 

9.有序集合类型(SortedSet):

9.1SortedSet(SkipList) 用链表的玩法来做到CURD logN的复杂度

zadd key score(用来排序) member

9.2zscore key member 获取member的分数

9.3zrange key start stop [withscores] start stop 是索引

  Zrevrange key start stop [withscores] 倒序

9.4zrangebyscore key min max [withscores] limit offset count     minmax是分数

  zrevrangebyscore key max min [withscores] limit offset count

 

获取最热门的top10的文章

Zrevrangebyscore articles 无限 0 limit 0 10

 

 

10.事务

multi 事务开始

exec  事务执行

watch watch命令可以监控一个或者多个键,一旦其中有一个键被修改,之后的事务就不会执行。

 

 

11.订阅与发布功能

subscribe channel

public channel message

 

psubscribe pattern 订阅一个或多个符合模式的频道

比如psubscribe channel.*

 

11.redis中的两种序列化方式:

RDB  [快照]

<think> 我们正在解决Redis服务启动失败的问题,特别是涉及`start-limit`和`exit-code`错误。用户询问了`sudo systemctl enable redis.service`命令的含义,并希望得到解决启动失败的方法。 ### 1. `sudo systemctl enable redis.service`命令的含义 此命令用于**启用Redis服务的开机自启动**,具体作用如下: - 在systemd系统中创建符号链接,将Redis服务单元文件(`redis.service`)关联到系统启动目标(通常是`multi-user.target`)[^2][^3]。 - 执行后,Redis服务会在服务器重启时自动启动,无需手动干预。 - 命令输出示例: ```bash Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /etc/systemd/system/redis.service. ``` - **注意**:此命令仅配置自启,不立即启动服务。需配合`systemctl start redis.service`触发首次运行。 --- ### 2. 解决Redis服务启动失败(start-limit和exit-code错误)的方法 #### 错误原因分析 - **start-limit错误**:Redis在短时间内启动失败次数过多,触发systemd保护机制(默认5次/10秒)[^1]。 - **exit-code错误**:底层服务启动失败(如配置文件错误、权限问题、端口冲突等),需查看日志定位具体原因。 #### 解决步骤(按顺序执行) ##### 步骤1:重置systemd失败计数器(解除start-limit限制) ```bash sudo systemctl reset-failed redis.service # 清除失败计数 sudo systemctl daemon-reload # 重新加载服务配置 ``` ##### 步骤2:检查并修复配置文件 - 确保Redis以**非守护进程模式**运行(由systemd管理进程生命周期): 1. 编辑配置文件(通常为`/etc/redis/6379.conf`): ```bash sudo vi /etc/redis/6379.conf ``` 2. 修改关键参数: ```ini daemonize no # 必须设为no,否则systemd无法跟踪进程[^1] supervised systemd # 启用systemd监管模式,提升稳定性[^3] ``` 3. 保存并退出。 ##### 步骤3:修复目录权限问题(常见于PID文件路径) - 手动创建Redis运行时目录并授权: ```bash sudo mkdir -p /var/run/redis sudo chown -R redis:redis /var/run/redis # 假设服务以redis用户运行 sudo chmod 755 /var/run/redis ``` - 在systemd服务文件(`/etc/systemd/system/redis.service`)中添加预启动命令(若目录权限仍失败): ```ini [Service] ... PermissionsStartOnly=true ExecStartPre=/bin/mkdir -p /var/run/redis ExecStartPre=/bin/chown redis:redis /var/run/redis ``` ##### 步骤4:检查日志定位根本原因 - 使用journalctl查看Redis启动日志: ```bash sudo journalctl -u redis.service -n 50 --no-pager # 查看最近50条日志 ``` - **常见错误及解决**: - **端口冲突**:修改`redis.conf`中的`port`(如`6380`)。 - **内存不足**:调整`maxmemory`策略或释放资源。 - **配置文件语法错误**:运行`redis-server /path/to/redis.conf --test`校验配置文件[^4]。 ##### 步骤5:重启Redis服务 ```bash sudo systemctl start redis.service # 启动服务 sudo systemctl status redis.service # 验证状态应为"active (running)" ``` - 若状态正常,启用开机自启: ```bash sudo systemctl enable redis.service ``` --- ### 关键注意事项 - **避免频繁重启**:每次修复后等待至少20秒再重试,防止再次触发start-limit[^1]。 - **服务文件路径校对**:确保`redis.service`中的`ExecStart`指向正确的Redis二进制路径(使用`whereis redis-server`确认)。 - **备份配置**:修改前备份`redis.conf`和`redis.service`文件,便于回滚。 --- ### 相关问题 1. 如何防止Redis的`start-limit`错误在系统重启后再次发生? 2. Redis作为systemd服务时,日志管理的最佳实践是什么? 3. 如何诊断Redis启动时的`exit-code 1`错误的具体原因? [^1]: Redis设置开机自启报错start-limit-hit。问题:在银河麒麟服务器上编译安装了redis后设置systemctl开机自启报错start-limit-hit 如何解决? 因为开机自启的需求是后面新增的,所以一开始使用的是命令启动,使用命令启动就会直接在前台启动,如是我就修改了redis.conf的配置文件中的daemonize 为yes,后来配置开机自启后使用systemctl start redis启动就报错。 所以!凡是配置systemctl开机自启的方式,都需要将daemonize 设置为no。 [^2]: 要这样做,请输入以下命令: sudo systemctl enable redis Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /etc/systemd/system/redis.service. 结论。 [^3]: Output ● redis.service - Redis Server Loaded: loaded (/etc/systemd/system/redis.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2016-05-11 14:38:08 EDT; 1min 43s ago Process: 3115 ExecStop=/usr/local/bin/redis-cli shutdown (code=exited, status=0/SUCCESS) Main PID: 3124 (redis-server) Tasks: 3 (limit: 512) Memory: 864.0K CPU: 179ms CGroup: /system.slice/redis.service └─3124 /usr/local/bin/redis-server 127.0.0.1:6379 . . . 测试Redis实例功能。 [^4]: 开头便有这样一行命令,这也是十分常用的启动 Redis 方式,我们一般会将多种配置方案放在一个配置目录中,按需启动。 # Note that in order to read the configuration file, Redis must be # started with the file path as first argument: # # ./redis-server /path/to/redis.conf。 </think> ### 命令解析:`sudo systemctl enable redis.service` **含义**: 此命令用于**启用 Redis 服务的开机自启动功能**,具体作用包括: 1. **创建符号链接**:在 systemd 的多用户目标目录(`/etc/systemd/system/multi-user.target.wants/`)中创建指向 Redis 服务文件的链接[^2] 2. **配置持久化**:确保服务器重启后 Redis 服务自动启动 3. **非即时生效**:仅配置自启策略,不立即启动服务(需配合 `systemctl start` 启动) ```bash # 执行后典型输出: Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /etc/systemd/system/redis.service. ``` --- ### 解决 Redis 启动失败(start-limit & exit-code 错误)的完整方案 #### 步骤 1:解除 start-limit 限制 ```bash sudo systemctl reset-failed redis.service # 重置失败计数器 sudo systemctl daemon-reload # 重新加载服务配置 sleep 10 # 避免立即重启触发限制 ``` #### 步骤 2:修复核心配置错误 1. **修改 Redis 配置文件** (`/etc/redis/6379.conf`): ```ini daemonize no # 必须设为 no(systemd 要求)[^1] supervised systemd # 启用 systemd 监管模式 [^3] pidfile /var/run/redis/redis.pid # 确保路径存在 ``` 2. **修复权限问题**: ```bash sudo mkdir -p /var/run/redis sudo chown -R redis:redis /var/run/redis # 授权 Redis 用户 [^2] ``` #### 步骤 3:修正 systemd 服务文件 编辑 `/etc/systemd/system/redis.service`,确保包含: ```ini [Service] Type=forking User=redis Group=redis ExecStartPre=/bin/mkdir -p /var/run/redis ExecStartPre=/bin/chown redis:redis /var/run/redis ExecStart=/usr/local/redis/bin/redis-server /etc/redis/6379.conf RestartSec=5s # 避免频繁重启触发限制 ``` #### 步骤 4:诊断根本原因(解决 exit-code 错误) ```bash # 查看详细错误日志 sudo journalctl -u redis.service --since "5 minutes ago" -p 3 # 手动测试启动(显示详细错误) sudo -u redis /usr/local/redis/bin/redis-server /etc/redis/6379.conf --test ``` **常见 exit-code 原因**: - 端口冲突(修改 `port 6380`) - 配置文件语法错误(使用 `redis-server /path.conf --test` 校验[^4]) - 内存不足(调整 `maxmemory` ) - 数据恢复失败(检查 AOF/RDB 文件完整性[^5]) #### 步骤 5:重启并验证服务 ```bash sudo systemctl daemon-reload sudo systemctl start redis.service sudo systemctl status redis.service # 检查状态 redis-cli ping # 应返回 PONG ``` #### 步骤 6:持久化配置 ```bash sudo systemctl enable redis.service # 启用开机自启 [^2][^3] ``` --- ### 关键注意事项 1. **启动间隔**:连续失败会触发 start-limit,每次修复后等待至少 10 秒再重启 2. **权限一致性**:Redis 进程用户(`redis`)需拥有: - 配置文件读写权 - 数据目录读写权 - PID 文件目录写权 3. **日志优先**:`journalctl` 输出的错误代码是诊断 exit-code 的核心依据 --- ### 相关问题 1. 如何通过 `journalctl` 日志诊断 Redis 的特定启动错误? 2. Redis 作为 systemd 服务时,哪些配置参数会与守护进程模式冲突? 3. systemd 的 `start-limit` 保护机制如何调整阈(如增加重试次数)? [^1]: Redis设置开机自启报错start-limit-hit。问题:在银河麒麟服务器上编译安装了redis后设置systemctl开机自启报错start-limit-hit 如何解决? 因为开机自启的需求是后面新增的,所以一开始使用的是命令启动,使用命令启动就会直接在前台启动,如是我就修改了redis.conf的配置文件中的daemonize 为yes,后来配置开机自启后使用systemctl start redis启动就报错。 所以!凡是配置systemctl开机自启的方式,都需要将daemonize 设置为no。 [^2]: 要这样做,请输入以下命令: sudo systemctl enable redis Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /etc/systemd/system/redis.service. 结论。 [^3]: Output ● redis.service - Redis Server Loaded: loaded (/etc/systemd/system/redis.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2016-05-11 14:38:08 EDT; 1min 43s ago Process: 3115 ExecStop=/usr/local/bin/redis-cli shutdown (code=exited, status=0/SUCCESS) Main PID: 3124 (redis-server) Tasks: 3 (limit: 512) Memory: 864.0K CPU: 179ms CGroup: /system.slice/redis.service └─3124 /usr/local/bin/redis-server 127.0.0.1:6379 . . . 测试Redis实例功能。 [^4]: 开头便有这样一行命令,这也是十分常用的启动 Redis 方式,我们一般会将多种配置方案放在一个配置目录中,按需启动。 # Note that in order to read the configuration file, Redis must be # started with the file path as first argument: # # ./redis-server /path/to/redis.conf。 [^5]: 以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值