Redis 基础知识 (不定期更新)


  • 什么是队列? 什么是栈?

    • 队列是先进先出, 栈是先进后出.
  • 原子操作:

    • 指将一系列的操作看作成一个整体,不可中断,开始执行到结束.
  • MySQL 与 NoSQL 的区别?

    • MySQL是关系型数据库, NoSQL是非关系型数据库
    • 存储方式不同: MySQL数据存在特定结构的表中;NoSQL可以存在json文档中,hash表中或其它方式
    • 数据关系不同:MySQL必须建立好表,确定关系,才能存储数据;而在NoSQL中,不限时间不限地点都可以进行数据存储
    • 外部存储数据:SQL中增加外部数据时,是在原表中增加外键,关联外部数据;而NoSQL则可以集中放置数据.
    • JOIN查询:MySQL使用join做集合查询,而NoSQL没有提供这种交集查询方式.
    • 事务处理:MySQL多张表同批次进行数据操作,就是通过事务处理的,其中一张表失败,其它表更新也会失败.NoSQL没有事务概念.
  • NoSQL优势:

    • 灵活的可扩展性
    • 维护成本低
    • 大数据的处理能力
    • 灵活的数据类型
    • 数据存储的成本低,通过商业服务器集群管理膨胀的数据
  • NoSQL劣势:

    • 单产品成熟度不够
    • 后续技术支持后劲不足
    • 分析能力和商业智能化血线淡泊
    • 缺乏高精尖专业人才

Redis 的增删改查

常用命令

    set key     插入数据
    get key     查询数据
    del key     删除数据
    getset key  修改数据
    exists key  验证key是否存在

Redis常用数据类型

string 类型

是Redis中二进制、最简单的key-value类型,最大数据上限1G.

string 类型数据常用命令

序号 命令 格式 解释
1 set set key value 设置指定key的值
2 get get key 获取指定key的值
3 getrange getrange key start end 返回key中字符串的子字符(下标从0开始)
4 getset getset key value 修改指定key的值,并返回key的旧值
5 getbit getbit key offset 对key所储存的字符串值, 获取指定偏移量上的位(bit)
6 mget mget key1 key2 获取一个或多个给定key的值
7 setbit setbit key offset value 对key所储存的字符串值,设置或清除指定偏移量上的位(bit)
8 setex setex key seconds value 将值value关联到key,并将key的过期时间设为seconds(以秒为单位)
9 setnx setnx key value 只有在key不存在时设置key的值为value
10 setrange setrange key offset value 用value参数覆写给定key所储存的字符串值,从偏移量offset开始
11 strlen strlen key 返回key所储存的字符串值的长度
12 mset mset key value [key value] 同时设置一个或多个key-value对
13 msetnx msetnx key value[key value] 同时设置一个或多个key-value对,当且仅当所有给定key都不存在
14 psetex psetex key milliseconds value 这个命令和 setex 命令相似,但它以毫秒为单位设置key的生存时间
15 incr incr key 将key中储存的数字值 +1
16 incrby incrby key increment 将key所储存的值加上给定的增量值
17 incrbyfloat incrbyfloat key increment 将key所储存的值加上给定的浮点增量值
18 decr decr key 将key中储存的数字值 -1
19 decyby decrby key decrement key所储存的值减去给定的减量值
20 append append key value 如果key已经存在并且是一个字符串,将value追加到key值的末尾

Redis中list类型及操作

序号 命令 格式 解释
1 lpush lpush key value 将一个或多个值插入到已存在的列表头部
2 rpush rpush key value 将一个或多个值插入到已存在的列表尾部
3 linsert linsert key before/after pivot value 在列表的元素前或后插入元素
4 lset lset key index value 通过索引设置列表元素的值
5 lrem lrem key count value 移除列表元素
6 ltrim ltrim key start stop 对一个列表进行修剪(trim), 列表保留指定区域内的元素
7 lrange lrange key start stop 获取列表中的某一片段
8 lpop lpop key 移出并获取列表的第一个元素
9 rpop rpop key 移出兵获取列表的最后一个元素
10 rpoplpush rpoplpush source destination 移除列表的最后一个元素,并将该元素添加到另外一个列表并返回
11 lindex lindex key index 通过索引获取列表的元素
12 llen llen key 获取列表长度

Redis中hash类型及操作

序号 命令 格式 解释
1 hset hset key field value 将哈希表中key中字段field的值设为value
2 hget hget key field 获取储存在哈希表中指定字段的值
3 hmget hmget key field1 ... fieldN 获取所有给定字段的值
4 hmset hmset key field1 value1 ... fieldN valueN 同时设置到哈希表中多个field
5 hincrby hincrby key filed increment 为哈希表key中指定字段加上给定值
6 hexists hexists key field 查看哈希表key中是否存在filed字段
7 hdel hdel key field 删除一个或多个哈希字段
8 hlen hlen key 获取哈希表中字段的数量
9 hkeys hkeys key 获取哈希表中所有字段
10 hvals hvals key 获取哈希表中所有的值
11 hgetall hgetall key 获取哈希表中指定key的所有字段和值

Redis中sets类型及操作

数学中的集合,对集合进行添加,删除以及获取交集差集等操作.

序号 命令 格式 解释
1 sadd sadd key member1[ member2] 向集合中添加一个或者多个元素
2 srem srem key member1[ member2] 移除集合中一个或者多个元素
3 smembers smembers key 返回集合中所有元素
4 spop spop key 移除并返回集合中的一个随机元素
5 sdiff sdiff key1[key2] 返回key2中没有key1的所有元素差集
6 sdiffstore sdiffstore destination key1 key2 返回给定所有集合的差集兵存储在destination中
7 sinter sinter key1 key2 返回给定所有集合的交集
8 sinterstore sinterstore destination key1 key2 返回给定所有集合的交集并存储在destination中
9 sunion sunion key1 key2 返回给定所有集合的并集
10 sunionstore sunionstore destination key1 key2 返回所有给定集合的并集 存储在destination中
11 smove smove source destination member 将member元素从source集合移动到destination集合
12 scard scard key member 获取集合成员数
13 sismember sismember key member 判断member元素是否是集合key的成员
14 srandmember srandmember key[count] 返回集合中一个或多个随机数

Redis中zsets类型及操作

序号 命令 格式 解释
1 zadd zadd key score1 member 添加member元素到集合key, 若元素在集合中存在,则更新对应的score
2 zrem zrem key member 删除指定元素,1表示成功,如果元素不存在则返回0
3 zincrby zincby key incr member 有序集合中对指定成员的score增加对应增量,返回更新后的score值
4 zrank zrank key member 返回有序集合中指定成员的索引
5 zrevrank zrevrank key member 返回有序集合中指定成员的排名,有序集合成员按分数值递减排序
6 zrange zrange key start end 通过索引区间返回有序集合成指定区域内的成员
7 zrevrange zrevrange key start end 返回集合中指定区间内的成员,通过索引,分数从高到低
8 zrangebyscore zrangebyscore key min max 通过分数返回有序集合指定区间内的成员
9 zcount zcount key min max 计算在有序集合中指定区间分数的成员数
10 zcard zcard key 获取有序集合的成员数
11 zscore zscore key element 返回有序集合中,成员的分数值
12 zremrangebyrank zremrangebyrank key min max 移除有序集合中给定的排名区间的所有成员
13 zremrangebyscore zremrangebyscore key min max 移除有序集合中给定的分数区间的所有成员

Redis中常用命令及操作

序号 命令 格式 解释
1 keys keys pattern 返回符合给定要求的所有key
2 exists exists key 判断key是否存在
3 del del key 删除一个key
4 expire expire key seconds 设置一个key的过期时间, 单位:秒
5 move move key db 当前key 移到其它db数据库中
6 persist persist key 移除key的过期时间
7 randomkey randomkey - 随机返回key空间的一个key
8 rename rename key 重命名key
9 type type key 返回key所对应value的类型

Redis中的订阅/发布

序号 命令 格式 解释
1 subscribe subscribe channel 订阅给定的一个或多个频道的信息
2 publish publish channel message 将信息发送给指定的频道 channel
3 psubscribe psubscribe pattern 订阅一个或多个符合给定模式的频道
4 pubsub pubsub subcommand 查看订阅与发布系统状态
5 punsubscribe punsubscrib pattern 退出所有给定模式的频道
6 unsubscribe unsubscribe channel 退出给定的频道

Redis服务器的相关命令

序号 命令 格式 解释
1 ping ping [message] 测试连接是否存活
2 echo echo message 在命令行打印一些内容
3 select select index 选择数据库
4 quit quit 退出连接
5 dbsize dbsize 返回当前数据库中key的数目
6 info info section 获取服务器的信息和统计
7 config get config get 获取服务器配置信息
8 flushdb flushdb 删除当前选择数据库中的所有key
9 flushall flushall 删除所有数据库中的所有key

Redis主从复制实现

  1. 首先创建 6380 6381两个文件夹,复制redis.conf至目录下,并修改配置文件端口号与文件夹一致
  2. 开启服务 redis-server ./6380/redis.confredis-server ./6381/redis.conf
  3. 创建实例连接服务端redis-cli -p 6380redis-cli -p 6381
  4. 6380端口数据库中使用 slaveof 127.0.0.1 6381 配置主从

返回 ok 后 在6380端口客户端执行 info replication查看信息(我本地是windows测试)

E:\>\soft\redis\redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:slave # 当前角色 slave 代表从数据库
master_host:127.0.0.1   # 主数据库IP
master_port:6381        # 主数据库端口
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:141
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380>

6381端口客户端执行 info replication 查看信息(本地windows)

E:\>\soft\redis\redis-cli -p 6381
127.0.0.1:6381> info replication
# Replication
role:master # 当前角色 master 代表主数据库
connected_slaves:1 # 已连接从数据库数量
slave0:ip=127.0.0.1,port=6380,state=online,offset=281,lag=0
master_repl_offset:281
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:280
127.0.0.1:6381>
  1. 停止端口号为6381的redis服务器(模拟6381主服务器出现问题无法使用等情况)
  2. 开启端口号为6381的redis服务器,并设定6381端口数据库为端口号6380数据库的从库
redis-server --port 6380 --slaveof 127.0.0.1 6381

连接端口号为6381的redis客户端,使用info replication命令查询状态

127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=281,lag=0
master_repl_offset:281
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:280
127.0.0.1:6381>

权限认证

为了安全,通常master主库配置文件中会使用requirepass,而在slave从库中要做masterauth权限认证

跨IP连接Redis-server

以IP为192.168.44.130作为Redis-sever,以192.168.44.128作为Redis-cli连接

修改Redis-server配置文件,保证protected-mode值为yes,查找bind 注释掉bind 127.0.0.1

查找 requirepass, 在下方写入(注意密码复杂度)

requirepass myPass

保存退出

在IP为192.168.44.128客户端上输入一下命令尝试连接Reids-server

# 连接Redis-server
redis-cli -h 192.168.44.130 -p 6379
AUTH myPass

Redis哨兵的创建与实现

建立哨兵方式 1:

redis-sentinel /path/to/sentinel.conf

建立哨兵方式 2:

redis-server /path/to/sentinel.conf --sentinel

Sentinel的配置

sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000

解析:

其中mymaster表示要监控的主数据库的名字,后两个参数表示主数据库的地址和端口号,这里我们要监控的是主数据库6379, 最后的2表示最低通过票数,当集群中有2个哨兵认为mymaster挂掉时,才能真正认为该master已经不可用了.而down-after-milliseconds表示每隔一定时间(单位:毫秒)发送一个ping命令,请求Server响应,来判断主数据库是否可用

Redis的事务机制

严格意义上来讲,Redis的事务与MySQL的事务是不一样的. Redis的事务实质上是命令的几何,在一个事务中, 要么所有命令都被执行, 要么所有事务都不执行.

Redis 事务机制的三个阶段

  1. 开始事务 MULTI
  2. 命令入队
  3. 执行事务EXEC
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set book "Redis"
QUEUED
127.0.0.1:6379> GET book
QUEUED
127.0.0.1:6379> SADD tag "java" "php" "golang" "python"
QUEUED
127.0.0.1:6379> SMEMBERS tag
QUEUED
127.0.0.1:6379> exec
1) OK
2) "Redis"
3) (integer) 4
4) 1) "golang"
   2) "java"
   3) "python"
   4) "php"

此外我们可以使用DISCARD取消事务。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> sadd tag "c++"
QUEUED
127.0.0.1:6379> sadd tag "mysql"
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> smembers tag
1) "golang"
2) "java"
3) "python"
4) "php"

需要注意的是:

  1. Redis的事务没有关系数据库事务提供的回滚(rollback),所以开发者必须在事务执行失败后进行后续的处理;
  2. 如果在一个事务中的命令出现错误,那么所有的命令都不会执行;
  3. 如果在一个事务中出现运行错误,那么正确的命令会被执行。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342