- Redis 基础

~ mac os 安装 redis

1、官网下载redis:https://redis.io/download

2、将下载的文件解压缩,复制到/usr/local/目录下;

3、终端cd到/usr/local/redis-5.0.4目录下,执行命令进行安装:
$ cd redis-3.2.8
$ make
$ sudo make install

4、修改配置文件:/usr/local/redis-5.0.4/redis.conf,然后将配置文件复制到/usr/local/etc目录下;

  • daemonize no改为daemonize yes:以守护进程的方式启动;
  • requirepass foobared改为requirepass 123456:修改密码;
  • bind 192.168.xx.xxx:设置可连接Redis的IP地址;127.0.0.1:6379> auth 123456
  • protected-mode no:设置成no,表示当没有使用bind指令配置地址(不配置表示监听任何地址)或没有配置密码时,Redis会启动保护模式,拦截客户的请求(可以建立连接,但是不能操作);如果没有bind,且注释了这个属性,那么protected-mode是开启的;
  • logfile /usr/local/redis-5.0.4/redis_log/redis_log.log:设置日志文件;
    $ sudo chmod 777 redis_log.log:修改文件权限;
  • dir ./改为dir /usr/local/redis-5.0.4/redis_dbfiles/:修改rdb文件默认路径;
    $ sudo mkdir /usr/local/redis-5.0.4/redis_dbfiles
    $ sudo chmod 777 /usr/local/redis-5.0.4/redis_dbfiles/
    pidfile /var/run/redis_6379.pid:当Redis在后台运行时,Redis默认会把pid文件放在该目录下,可以配置到其他地址;当运行多个Redis服务时,需要指定不同的pid文件和端口;
    loglevel notice:指定日志级别;
    debug:调试记录信息最多,用于开发和测试;
    verbose:默认,表示记录有用的信息;
    notice:表示普通的verbose,常用于生产环境;
    warning:表示只有非常重要或严重的信息会记录到日志;
    rename-command CONFIG "":命令重命名;在一个共享环境下,可以重命名相对危险的命令;

5、开启Redis服务:(T1)
$ cd /usr/local/bin
$ redis-server(交互式方式开启,Ctrl+C停止服务)
$ redis-server ../etc/redis.conf(使用redis.conf以守护进程方式启动Redis服务)
ps -ef|grep redis 确认服务是否已经启动;

6、开启Redis客户端:(交互式开启服务需要重新打开一个终端窗口T2,守护进程方式在当前窗口即可)
$ cd /usr/local/bin
$ redis-cliredis-cli -h 192.168.xx.xxx -p 6379 -a 123456

:启动redis服务器后终端所在的窗口就不能输入别的命令了,需要在终端打开新的窗口才能使用客户端功能;

7、测试服务端和客户端:(T2中)
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> exit:退出客户端;

8、关闭Redis服务:
(1)配置好config文件之后,直接shutdown客户端:redis-cli shutdownredis-cli -h 192.168.xx.xxx -p 6379 -a 123456 shutdown
127.0.0.1:6379> shutdown,Ctrl+C
(2)暴力关闭服务:kill -9 pid号
ps -u zxj -o pid,rss,command | grep redis-server:查看
(3)oh my zsh下直接kill redis按tab,会自动替换成对应的pid;


~ Redis

Redis是一个开源的key-value存储系统,将大部分数据存储在内存中;支持的数据类型包括:字符串、哈希表、链表、集合、有序集合以及基于这些数据类型的相关操作;

Redis基于内存操作,读写速度快,100000读写/秒,可作为内存型缓存服务器,提供持久化存储方案,可作为结构不复杂的数据库使用;

1、Redis客户端与服务器的关系: 客户端请求连接服务器,将请求的命令交给服务器,服务器再去操作内存;

2、Redis与关系型数据库区别: Redis里面都是使用指令进行操作的,关系型数据库使用SQL语言来操作数据;指令对于Redis的作用相当于SQL语句对于关系型数据库的作用;

3、应用场景:

  • 缓存
    (1) 对于一些要返回给前端数据的缓存,当有大量数据库sql操作时候,为了避免每次接口请求都要去查询数据库,可以把一些数据缓存到redis中,这样是直接从内存中获取数据,速度回增快很多;
    (2) web端用户,用于登陆缓存session数据,登陆的一些信息存到session中,缓存到redis中 ;
  • 队列
    redis中提供了list接口,这个list提供了lpush和rpop,这两个方法具有原子性,可以插入队列元素和弹出队列元素;
  • 数据存储
    redis是非关系型数据库,可以把redis直接用于数据存储,提供了增删改查等操作,因为redis有良好的硬盘持久化机制,redis数据就可以定期持久化到硬盘中,保证了redis数据的完整性和安全性
  • redis锁实现防刷机制
    redis锁可以处理并发问题,redis数据类型中有一个set类型,set类型在存储数据的时候是无序的,而且每个值是不一样的,不能重复,这样就可以快速的查找元素中某个值是否存在,精确的进行增加删除操作;

~ 在bin下可执行的程序

redis-server: Redis服务器;
redis-cli: 命令行客户端;
redis-benchmark: Redis的性能测试工具;
redis-check-aof: AOF文件修复工具;
redis-check-dump: RDB文件检测工具;
redis.conf: Redis的配置文件;


~ Redis数据结构及常用命令

命令参考:http://doc.redisfans.com

  • 卸载服务:redis-server –service-uninstall
  • 开启服务:redis-server –service-start
  • 停止服务:redis-server –service-stop

Redis中用于操作键的命令可以分为两种:可以对任何类型的键进行操作的命令、只能对特定类型的键执行的命令;

指定类型的键只能执行某些特定的命令,否则会发生类型错误的提示;在执行一个类型特定的命令之前,Redis会先检查输入键的类型是否正确,然后再决定是否执行给定的命令;
类型特定命令所进行的类型检查是通过redisObject对象的type属性来实现的;
在这里插入图片描述

(0)操作任何类型的key:

基本操作:

  • 127.0.0.1:6379> keys *:查看所有key;
  • 127.0.0.1:6379> del k1 k2 k3:删除key及对应的value;
  • 127.0.0.1:6379> exists k:查看指定key是否存在;
  • 127.0.0.1:6379> rename kOld kNew:给key重命名;
  • 127.0.0.1:6379> expire key second:设置过期时间,单位秒;
  • 127.0.0.1:6379> ttl key:查看key还剩多长时间就过期;若该key没设置过超时时间,返回-1;
  • 127.0.0.1:6379> type key:获取指定key的数据类型;
  • 127.0.0.1:6379> object encoding key:查看指定key使用的编码和数据结构;
  • 127.0.0.1:6379> object refcount key:查看指定key的值对象redisObject的引用计数的值;
  • 127.0.0.1:6379> object idletime key:查看指定key的空转时长;空转时长=当前时间-lru属性的时间,lru属性记录了对象最后一次被命令程序访问的时间;

操作数据库:

  • 127.0.0.1:6379> select 1:选择index=1的数据库;
  • 127.0.0.1:6379> move key 0:从当前数据库移动key到db0,当前选择的数据库是db1;

操作事务:

  • 127.0.0.1:6379> multi:开启事务;
  • 127.0.0.1:6379> exec:提交事务,执行所有事务块内的所有命令;
  • 127.0.0.1:6379> discard:取消事务(回滚),放弃执行事务块内的所有命令;

设置生存时间:
Redis有四个不同的命令用于设置键的生存时间(键可以生存多久)或过期时间(键什么时候会被删除),四个命令底层都是使用PEXPIREAT命令实现的,客户端在执行四个命令时,经过转换,最终的执行效果都是和执行PEXPIREAT命令一样;

  • 127.0.0.1:6379> EXPIRE/PEXPIRE a 3600:设置缓存时间(秒);
    客户端以秒或毫秒精度为数据库中的某个键设置生存时间(TTL,time to live),在经过指定的秒或毫秒之后,服务器就会自动删除生存时间为0的键;
  • 127.0.0.1:6379> EXPIREAT/PEXPIREAT a 3600:以秒或毫秒精度给数据库中的某个键设置过期时间;
    过期时间是一个Unix时间戳,当键的过期时间来临时,服务器就会自动从数据库中删除这个键;通过计算键的过期时间和当前时间之间的差来实现;
  • 127.0.0.1:6379> TTL/PTTL a:接收一个带有缓存时间/过期时间的键,返回这个键的剩余生存时间,也就是返回距离这个键被服务器自动删除还有多长时间;
  • 127.0.0.1:6379> TIME:查看时间;
  • 127.0.0.1:6379> PERSIST:移除一个键的过期时间;

操作缓存:

  • 127.0.0.1:6379> set a 123;:设置缓存:a=>123;
  • 127.0.0.1:6379> flushall:清空缓存;执行该命令后会清空redis服务器的所有缓存;
  • 127.0.0.1:6379> flushdb:清空数据库;
  • 127.0.0.1:6379> dbsize:返回数据库键的数量;

数据库配置:

  • 127.0.0.1:6379> info stats:查看数据库的配置属性;
(1)字符串(String)

string存储的元素类型可以是string/int/float,int类型可以进行增加和减少操作;

127.0.0.1:6379> set key value: 设置键key的值为value;
127.0.0.1:6379> append key value2: 在键key的值后面加上value2;
127.0.0.1:6379> get key :查看键key的值;
127.0.0.1:6379> getset key value :先获取key,再赋值;(值覆盖)
127.0.0.1:6379> incr key/decr key:将指定key对应的value递增(递减)1;若value不存在,则初始为0,再递增1,结果就是1;若value的值不能转成整型,报错;
127.0.0.1:6379> incrby key num/incrby key num:value+=num/value-=1;
127.0.0.1:6379> strlen

(2)哈希(hash)

String Key 和 String Value 的map容器;

127.0.0.1:6379> hset key field value:将键值对作为value存入key
127.0.0.1:6379> hmset key field1 value1 field2 value2
127.0.0.1:6379> hget key field:获取键值对中的值
127.0.0.1:6379> hmget key field1 field2:获取多个值
127.0.0.1:6379> hgetall key:获取指定key中的多个键值对
127.0.0.1:6379> hdel key field1 field2:删除key中指定键值对;
127.0.0.1:6379> del key:删除整个集合;包括key
127.0.0.1:6379> hincrby key field num:value+=num;
127.0.0.1:6379> hexists key field:判断指定key中的某个属性是否存在;
127.0.0.1:6379> hlen key:查看指定key中存储的属性的个数;
127.0.0.1:6379> hkeys key:获取指定key中存储的所有属性的名称;
127.0.0.1:6379> hvals key:获取指定key中存储的所有属性对应的值;

(4)字符串列表(List)

List:按插入顺序排列的字符串列表,数据可重复;
List存储数据有3种方式:

  • ArrayList使用数组方式存储数据,根据索引查询查询速度快,增删速度慢;
  • LinkList使用双向链表方式存储数据,两端插入删除,速度快;
  • 双向链表的方式双向添加删除;

127.0.0.1:6379> lpush/rpush key v1 v2 v3:左侧/右侧添加;
127.0.0.1:6379> lrange key startIndex endOIndex:查看数据,endIndex是-1时表示尾部元素,-2表示倒数第二个元素;
127.0.0.1:6379> lpop/rpop key:弹出指定key对应的valueList中左侧/右侧第一个元素;
127.0.0.1:6379> llen key:获取指定key对应的valueList列表中元素的个数;
127.0.0.1:6379> lpushx/rpushx key x:仅当指定key存在时,才在关联的list头部/尾部插入值x,若不存在,则不插入;
127.0.0.1:6379> lrem key count value:删除count个值为value的元素;count>0:从头到尾遍历删除count个value元素,count<0:从后向前,count=0:删除list中所有value元素;
127.0.0.1:6379> lrange key index value:在key对应的list中指定index位置插入value;
127.0.0.1:6379> linsert key before/after value x:在keylist的value前/后插入x;
127.0.0.1:6379> rpoplpush key1 key2:将key1List中最右元素弹出,压入key2List左侧; 常用于消息队列的服务,来完成多个程序之间的消息的交互

(4)字符串集合(set)

Set:没有排序的字符集合,和list类型一样,但是set不允许出现重复元素;
使用场景:

  • 1、使用Redis的set数据类型跟踪具有唯一性的数据:访问某一博客唯一IP地址信息;在每次访问该博客时将访问者的IP存储到set中,set自动保证IP地址的唯一性;
  • 2、维护数据对象之间的关联关系:用户购买商品时将购买商品1的用户ID存入一个set1,商品2的用户ID存入set2,若想查询同时购买两个商品的用户,只需获取两个set的交集即可;

127.0.0.1:6379> sadd key v1 v2 v3:添加
127.0.0.1:6379> srem key v1 v2:删除
127.0.0.1:6379> smembers key:查询元素
127.0.0.1:6379> sismember key value:判断元素是否在set中;返回1存在,0不存在;
127.0.0.1:6379> sdiff key1 key2:差集,获取k1中有,k2中没有的元素;
127.0.0.1:6379> sinter k1 k2:交集
127.0.0.1:6379> sunion k1 k2:并集,去除重复元素;
127.0.0.1:6379> scard key:获取set中元素数量;
127.0.0.1:6379> srandmember key:随机返回set中的一个成员;
127.0.0.1:6379> sdiffstore/sinterstore/sunionstore k k1 k2:将k1 k2两个set的差集/交集/并集存储到kSet 中;

(5)有序字符串集合(sorted set)

每一个成员都会有一个分数与之关联,Redis通过这个分数来为集合中的成员进行从小到大的排序;成员唯一,但是分数可重复;

**应用场景:**游戏排名:游戏玩家分数变化的时候使用zadd更新分数,微博热点话题排名;

127.0.0.1:6379> zadd key score1 v1 score2 v2 s3 v3:添加元素和分数,若元素已存在,则分数覆盖;
127.0.0.1:6379> zscore key value:获取指定key中指定元素的分数;
127.0.0.1:6379> zcard key:获取指定key中元素个数;
127.0.0.1:6379> zrem key v1 v1:删除元素;
127.0.0.1:6379> zrange key start end [withscore]:范围查找[按照分数从小到大排序];
127.0.0.1:6379> zrevrange key start end [withscore]:范围查找[按照分数从大到小排序];
127.0.0.1:6379> zremrangebyrank key start end:按排名范围删除;
127.0.0.1:6379> zremrangebyscore key scoreStart scoreEnd:按分数范围删除;
127.0.0.1:6379> zrangebyscore key start end [withscores] [limit start end]:按分数范围查找(显示分数)(只显示范围之间的元素);
127.0.0.1:6379> zincrby key num value:设置指定成员增加的分数;
127.0.0.1:6379> zcount key start end:查看指定范围之间的元素的个数;


~ redis特性:多数据库、事务

1、多数据库:
一个Redis实例可以包含多个数据库,客户端可以指定连接某个Redis实例的哪个数据库;一个Redis实例最多可以提供16个数据库,下标从0开始,客户端默认连接第0号数据库;也可以通过select选择具体连接哪个数据库;select 1

2、事务特性:

(1)事务中的命令都是串行执行的;
(2)事务执行期间redis不会再对其它的客户端提供任何服务,从而保证事务中的命令能够原子化执行;
(3)单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的;事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做;

~ redis数据持久化 - RDB/AOF

RDB数据持久化方式:

redis默认方式;在指定时间间隔内将内存中的数据集快照写入到磁盘,比如指定30秒写入磁盘一次,生成dump.rdb文件;
快照:把内存中存的东西记录一份,存到文件中去;

RDB方式的持久化是通过快照完成的,当符合一定条件时,Redis会自动将内存中的所有数据进行快照并存储到硬盘中;进行快照的条件可以在配置文件中自行定义;定义由两个参数组成:时间和改动的键的个数;当在指定的时间内被改动的键的个数大于指定的数值时就会进行快照;配置文件中预置了3个条件,可存在多个条件,条件之间是“或”的关系,只要满足其中一个条件就会进行快照;若想禁用快照,只需将所有save参数删除即可;

Redis默认会将快快照文件存储在当前目录的dump.rdb文件中,可通过配置dir和dbfilename两个参数分别指定快照的存储路径和文件名;

1、优势:

  • Redis数据库只包含一个文件存储在硬盘中,对于文件备份会很简单;
  • 对于灾难恢复,RDB是更好的选择,因为一个文件可以直接拷贝走,拷贝回来;
  • 性能最大化,redis开始持久化的时候只分出一些子进程,之后这些子进程会完成持久化工作,避免了服务器进程执行io的操作;数据集很大的时候,启动效率会更高;

2、缺点:

  • 数据可能丢失:系统一定在定时持久化之前出现一些档期的情况,还没有来得及往硬盘上写,数据已经丢失掉;
  • 因为RDB是通过开启子进程的方式来进行持久化操作的,因此当数据集比较大的时候,这个过程可能会导致服务器停止一定时间,几十毫秒甚至1秒;

3、配置:/usr/local/etc/redis-conf文件中:

save 900 1     // 900秒,也就是15分钟至少有一个key发生变化就会持久化一次
save 300 10    // 300秒,至少有10个key发生变化就会往硬盘中持久化一次
save 60 10000  // 60秒,至少有10000个key发生变化就会往硬盘中持久化一次

dbfilename dump.rdb  // dump是数据库的名字
dir ./         // 保存路径位置,就是当前目录下的上面的名字,就是持久化的数据库
AOF数据持久化方式:

(append only file)以日志的形式记录服务器所处理的每一个操作,生成历史记录文件,Redis服务器启动的时候,会读取该文件,然后重新去构建数据库,这样来保证服务启动后数据是完整的;

1、优势:

  • 可以带来更高的数据安全性,这种数据持久化方式有三种同步策略,每秒同步,每修改同步(每一次发生数据的变化都会立即被记录到磁盘中,效率最低但是最安全),不同步;
  • 日志的写入操作是采用append追加的模式,在写入过程中即使出现服务器档期问题,也不会破坏日志文件中已经写入的内容;
  • 如果日志过大,redis可以自动启动重写机制,redis会不断的将修改的数据写入到老的磁盘当中,同时redis会创建一个新的文件来记录此期间产生了哪些修改命令被执行了;
  • AOF包含一个格式非常清晰易于理解的日志文件,用于记录所有的修改操作,通过这个文件就可以完成数据的重建;

2、缺点:

  • 对于相同的数据集文件,AOF要比RDB文件大;
  • 根据同步策略的不同,AOF在运行效率上往往低于RDB,AOF每修改就同步到硬盘上效率肯定是没有RDB高的;

3、配置:

appendonly no   // 如果使用AOF的持久化方式,需要把appendonly 后面的属性变为yes
# The name of the append only file(default:"appendonly.aof")
appendfilename "appendonly.aof"  // appendonly.aof是用来记录所有修改操作的文件,这个文件还可以用来进行数据的恢复等,例如一条删除操作成功后,我们在appendonly.aof文件中把删除命令去掉,重新运行redis,之前的数据又都会恢复;

# 设置同步策略
# appendfsync always  // 每次修改就同步 持久化
appendfsync everysec  // 每秒同步持久化一次
# appendfsync no      // 不同步持久化

~ Redis性能测试:

1、测试存取大小为100字节的数据包的性能:redis-benchmark -h 127.0.0.1 -p 6379 -q -d 100;-d:date

2、100个并发连接(模拟100个用户连接Redis服务),100000个请求,检测host为localhost端口为6379的Redis服务器的性能:redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000;-c:client


~ 常见问题

1、Redis: Failed opening .rdb for saving: Permission denied
redis服务器会生成dump.rdb文件存储缓存,如果文件权限不够则无法读写该文件;
cd /usr/loal/bin
chmod 777 dump.rdb


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值