Redis

一、什么是redis

  • 1.Redis是远程的
    有客户端和服务端,客户端和服务端可以布置在不同的机器上,两者经过redis自定义的协议远程传输和交互的,我们一般说的是服务端。默认服务端口为6379。
  • 2.Redis是基于内存的
    所有的操作非常高速,性能优于比基于硬盘的MySQL要快很多,又因为所有的数据和结构存储于内存中非常吃内存。
  • 3.Redis是非关系型数据库
    本质上也是数据库,但MySQL关系型数据库存储时必须定义数据词典,而Redis则不需要

二、redis应用场景

  • 1.缓存
    某些系统接口比较慢的时候,可以把一些数据放在Redis中缓存起来,下次取数据就不进行非常耗时的SQL操作了,直接从缓存中取数据,提升系统性能最常用的方法之一;
  • 2.队列
    Redis 中有list接口,可以存储list。 使用Push插入队列的元素, 使用 Pop来弹出退出队列的元素,push和pop操作保证了原子性的实现;
  • 3.数据存储
    所有的增删改查都是在Redis中进行,Redis有硬盘的持久化机制,定期进行存储,不需要借助MySQL进行数据存储,保证了数据的完整性和安全性。

三、Redis安装环境

(一)Linux下安装Redis

  • 1、服务器环境
  • 2、Redis版本下载:http://download.redis.io/releases/
  • 3、预装软件(gcc:c语言编译器,tcl:一种语言)
  • 4、服务端安装步骤
    1)、进入解压后的目录,执行make
    2)、studo make install 将生成的二进制文件放到 /uer/local/bin目录下
    3)、复制redis.conf到自己指定的文件夹。 配置redis.conf文件,
    修改daemonize yes 后台启动Redis port 7200(多实例和安全问题)
    4)、启动 redis-server redis.conf
  • 5、redis客户端的安装
    查看redis客户端 which redis-cli
    登录:redis-cli -h 127.0.0.1 -p 7000(-h表示IP地址;-p表示端口号)
    redis-cli(默认登录本机6379端口)
    登录之后info命令查看redis信息
    (二)windows先安装Redis
  • 1、现在Redis安装包并解压
  • 2、打开Windows的cmd窗口,启动服务器(输入:redis-server.exe redis.windows.conf )
  • 3、重启一个cmd窗口,启动客户端(输入:redis-cli.exe -h 127.0.0.1 -p 6379 )
  • 4、将 redis 服务器启动放入 windows 服务中,使其开机自动启动(输入:redis-server --service-install redis.windows.conf --loglevel verbose)

四、Redis的五种数据类型

Paste_Image.png
  • 1、string
// setnx 表示如果没有存在key值则创建该条数据,否则不创建
// setex 设置键值的过期时间
127.0.0.1:6379> set string zhangsna
OK
127.0.0.1:6379> get string
"zhangsna"
127.0.0.1:6379> setex string 10 zhangsna
OK
127.0.0.1:6379> get string
"zhangsna"
// 10秒后
127.0.0.1:6379> get string
"nil"
// 修改内容,将string从第二个制服开始改为yyy
127.0.0.1:6379> setrange string 2 yyy
// 批量操作mset、mget

string自增操作incr(incrby num:增加num)

127.0.0.1:6379> set string2 4
OK
127.0.0.1:6379> get string2
"4"
127.0.0.1:6379> incr string2
(integer) 5
127.0.0.1:6379> get string2
"5"

减操作decrby

127.0.0.1:6379> decrby string2 2
(integer) 3
127.0.0.1:6379> get string2
"3"
  • 2.List
    从左侧推入两个元素,并从右侧弹出
127.0.0.1:6379> lpush list1 12
(integer) 1
(1.00s)
127.0.0.1:6379> lpush list1 13
(integer) 2
127.0.0.1:6379> rpop list1
"12"
// 获取所有元素
127.0.0.1:6379> lrange list1 0 -1
1) "13"
2) "12"127.0.0.1:6379> lrange list1 0 -1
1) "13"
2) "12"

llen输出List中有几个元素,元素可以重复

127.0.0.1:6379> lpush list 12
(integer) 1
127.0.0.1:6379> lpush list 13
(integer) 2
127.0.0.1:6379> lpush list 13
(integer) 3
127.0.0.1:6379> llen list
(integer) 3
  • 3、set(不可重复)
    添加元素:sadd set1 12
    判断有多少个元素:scard set1
    判断某个元素是否在set里面:smembers set1 12
    删除某个元素:srem set1 12
127.0.0.1:6379> sadd set1 12
(integer) 1
127.0.0.1:6379> sadd set1 13
(integer) 1
127.0.0.1:6379> sadd set1 13
(integer) 0
127.0.0.1:6379> scard set1
(integer) 2
  • 4、Hash
    插入/修改:hset hash1 key1 12
    获取:hget hash1 key1
    查看hash长度:hlen key
    一次性获取:hmget hash1 key1 key2
127.0.0.1:6379> hset hash1 key1 12
(integer) 1
127.0.0.1:6379> hget hash1 key1
"12"
127.0.0.1:6379> hset hash1 key2 13
(integer) 1
127.0.0.1:6379> hset hash1 key3 13
(integer) 1
127.0.0.1:6379> hlen hash1
(integer) 3
127.0.0.1:6379> hset hash1 key3 14
(integer) 0
127.0.0.1:6379> hget hash1 key3
"14"
127.0.0.1:6379> hmget hash1 key1 key2 key3
1) "12"
2) "13"
3) "14"
  • 5、sort set
    增加/修改:zadd zset1 10.1 val1
    查看个数:zcard zset1
    查看排名:zrange zset1 0 2 withscores
    查看某个value排名:zrank zset1 val2
    sort set类型操作,如果两个元素的score一样,按照字节顺序排列先后
127.0.0.1:6379> zadd zset 10.1 val1
(integer) 1
127.0.0.1:6379> zadd zset 11.2 val2
(integer) 1
127.0.0.1:6379> zadd zset 9.2 val3
(integer) 1
127.0.0.1:6379> zcard zset
(integer) 3
127.0.0.1:6379> zrange zset 0 2 withscores
1) "val3"
2) "9.1999999999999993"
3) "val1"
4) "10.1"
5) "val2"
6) "11.199999999999999"
127.0.0.1:6379> zrank zset val2
(integer) 2
127.0.0.1:6379> zadd zset 12.2 val3
(integer) 0
127.0.0.1:6379> zrange zset 0 2 withscores
1) "val1"
2) "10.1"
3) "val2"
4) "11.199999999999999"
5) "val3"
6) "12.199999999999999"
127.0.0.1:6379> zadd zset 12.2 val2
(integer) 0
127.0.0.1:6379> zrange zset 0 2 withscores
1) "val1"
2) "10.1"
3) "val2"
4) "12.199999999999999"
5) "val3"
6) "12.199999999999999"

五、redis的持久化方式

  • 1、快照(rdb):redis默认的持久化方式,将内存中的数据写入到硬盘的二进制文件中,可以再配置文件中配置自动快照,如:如果redis在900秒内有超过1个key值发生改变,就会自动快照;由于快照是每隔一段时间执行一次,因此如果redis意外down掉的话,就会丢失部分数据;


    image.png
  • 2、aof方式:redis将每次收到的写命令通过write函数存到硬盘的文件中,重启redis后,会读取这个文件中的写命令并执行,便可以重建整个数据库;首先开启aof,改为appendony yes,开启后会有三种策略可供选择,分别为每次写入redis时都进行持久化、每秒进行持久化和不主动之久话
# appendfsync always
appendfsync everysec
# appendfsync no
image.png

应用场景

  • 1、获取最新的N条数据;
  • 2、排行榜,取TOP N操作;
  • 3、精确过期时间;
  • 4、计数器;
  • 5、某时间段的数据排重;
  • 6、队列系统;
  • 7、缓存;

常用命令

keys * // 取出所有key
exists name // 是否存在key为name
del // 删除键
expire // 设置某一键的过期时间
ttl // 查询键有效时长
move //将key转移另一个数据库
persist // 移除key的过期时间
randomkey // 随机返回一个key
dbsize // 返回当前数据库键数
info // 获取服务器信息
config get // 返回相关配置的值
flushdb // 删除当前数据库所有key
flushall // 删除所有数据库key

六、主从复制(陪从不配主)

一主两从

  • 1、新建两个 redis 的配置文件,分别命名为 redis6380.conf 和 redis6381.conf 作为从库;


    image.png
  • 2、修改配置文件,端口号和日志名字

image.png

image.png
  • 2、启动主库和从库(从库启动后还未配置为从库时,仍然显示为主库)


    image.png

    image.png
  • 3、配置从库
slaveof IP地址 端口号
image.png
  • 4、查看配置情况


    image.png

注意:
1、redis 的配置完主从复制后,主库用于写入操作,从库用于读取,此时从库无法成功写入数据;
2、如果此时主库停止服务,则此时从库处于待命,主库服务恢复后,从库自动连接;

哨兵模式

由于普通的主从,在主机挂倒之后,从库无法写入,redis 功能无法使用。因此想要寻找一种方法来解决该问题。哨兵模式就是后台监控主库,当主库故障无法工作时,在从库中通过投票的方式选出一个充当主库来继续工作;

  • 1、在原来放置 redis 配置文件的文件夹中新建文件 sentinel.conf


    image.png
  • 2、编辑配置文件
sentinel monitor 被监控数据库名字(自己起名字) 127.0.0.1 6379 1
1 代表从库得票数大于 1 时被选择做主库
  • 3、启动监控


    image.png
  • 4、停掉主库,从从库中选一个充当主库
    6381 被选为主库,6380成为其从库


    image.png
image.png
  • 5、重启 6349 库后,该库成为了 6381 的从库(重启后等一段时间,可能无法重启后立即生效);


    image.png

七、内存淘汰机制

名称 描述
volatile-lru 从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile-lfu 从已设置过期时间的数据集中挑选最不经常使用的数据淘汰
volatile-ttl 从已设置过期时间的数据集中挑选将要过期的数据淘汰
volatile-random 从已设置过期时间的数据集中挑选任意数据淘汰
allkeys-lru 当内存不足写入新数据时淘汰最近最少使用的Key
allkeys-random 当内存不足写入新数据时随机选择key淘汰
allkeys-lfu 当内存不足写入新数据时移除最不经常使用的Key
no-eviction(默认) 当内存不足写入新数据时,写入操作会报错,同时不删除数据

注意:

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

推荐阅读更多精彩内容

  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 3,958评论 2 27
  • 《Redis 入门指南》(第二版) 第一章 Redis 是什么 Redis (REmote Dictionary ...
    EdenPP阅读 67,290评论 3 10
  • 本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍。之后概...
    kelgon阅读 61,122评论 24 626
  • 1 Redis介绍1.1 什么是NoSql为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方...
    克鲁德李阅读 5,266评论 0 36
  • UPS的定义 UPS即不间断电源,是将蓄电池与主机相连接,通过主机逆变器等模块电路将直流电转换成市电的系统设备...
    筱海阅读 252评论 1 3