redis初识

redis

1.1 NoSQL概述

非关系型数据库, not noly SQL,为解决性能问题,key-value 存储结构(大大增加了数据库的扩展能力)

  • 不遵循SQL标准
  • 不支持ACID(原子性,一致性,隔离性,持久性)
  • 远超SQL性能

1.2 NoSQL适用场景

  • 对高并发数据进行读写
  • 对海量数据进行读写
  • 对数据高可扩展形的读写

1.3 NoSQL不适用场景

  • 需要事务支持
  • 基于sql的结构化查询存储,处理复杂关系

(用不着sql的和用了sql也不行的情况下,考虑用NoSQL)

1.4 安装redis

进入redsi官网redis.io下载压缩包,将压缩包拖入虚拟机/opt目录下,redis需要提前装好c的环境和gcc

1.1.4 检查gcc

gcc --version

1.4.2 解压redis

sudo tar -zxvf redis-6.2.6.tar.gz

1.4.3 编译

make

1.4.4 安装

跳过make test直接安装

make install

redis会默认安装在==/usr/local/bin==目录下

1.4.5

redis-benchmark:服务启动起来后执行性能测试工具,可以在自己本子运行,看看自己本子性能如何;
redis-check-aof:修复有问题的aof文件;
redis-check-dump:修复有问题的dump.rdb文件;
redis-cli:客户端,操作入口;
redis-sentinel:redis集群使用;
redis-server:Redis服务器启动命令;

1.4.6 启动redis

1.4.6.1 前台启动(不推荐)

命令行输入redis-server

停止redis命令 ctrl + c

1.4.6.2 后台启动(推荐)

进入/opt目录找到redis.conf文件,将redis.conf文件复制到/etc目录下

cp redis.conf /etc/redis.conf

修改redis.conf文件将里面的daemonize no 改成 yes,让服务在后台启动;

将默认的redis.conf拷贝到自己定义好的一个路径下,比如/etc/redis.conf;

再进入/usr/local/bin目录下启动redis, 命令redis-server /etc/redis.conf

可用ps -ef | grep redsi查看redis进程

使用redis-cli客户端连接redis

使用shutdown关闭redis

错误

127.0.0.1:6379> shutdown
(error) ERR Errors trying to SHUTDOWN. Check logs.

首先,我在关闭的时候,报出错误,告诉我们尝试关闭时错误,叫我们检查日志

那我们就去看一下日志:

  1. ps -ef | grep redis 找到redis的当前进程号

再使用 kill -9强制关闭redis进程:

kill -9  17001 

在/usr/local/redis目录下创建一个日志文件: touch redis_log.log

vi redis_log.log

2.更改log-redis.log文件

logfile "/usr/local/redis/redis_log.log"

3.若还不成则修改权限

chmod 777 log-redis.log

再次关闭时则成功了

redis数据库的一些概念及操作

1.单进程模型来处理客户端的请求。对读写等事件的响应是通过对epoll函数的包装来做到的。Redis的实际处理速度完全依靠主进程的执行效率;、

2.epoll是Linux内核为处理大批量文件描述符而作了改进的epoll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率;

3.默认16个数据库,类似数组下表从零开始,初始默认使用0号库

4.统一密码管理,16个库都是同样密码,要么都OK要么一个也连接不上,redis默认端口是6379

5.select命令切换数据库:select 0-15;

6.dbsize:查看当前数据库的key的数量;

7.flushdb:清空当前库;

8.flushall;通杀全部库;

9.redis是单线程+多路IO复用技术


2.1 五大常用数据类型

  • String(字符串)
  • list(列表)
  • set (集合)
  • hash(哈希表)
  • zset(有序集合)

keys *:查看所有key;
exists key:判断某个key是否存在;
move key dbID(0-15): 当前库就没有了,被移除了;
expire key 10 : 为给定的key设置过期时间10秒;
ttl key: 查看还有多少秒过期,-1表示永不过期,-2表示已过期;
type key: 查看你的key是什么类型;

del key : 查看key的类型

unlink key : 根据value选择非阻塞删除(仅仅将key从元数据中删除,真正的删除会在后续的异步操作)


2.2.1 String

- string类型是二进制安全的。意思是redis的string可以包含任何数据。如jpg图片或者序列化的对象 
- string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M;

- set/get/del/append/strlen;

- Incr/decr/incrby/decrby:一定要是数字才能进行加减;

- getrange:获取指定区间范围内的值,类似between and的关系从零到负一表示全部;

- setrange:设置指定区间范围内的值,格式是setrange key 位置值 具体值;

- setex(set with expire) 键 秒值 值/setnx(set if not exist)- setex:设置带过期时间的key,动态设置 : setex 键 秒值 真实值

- setnx:只有在 key 不存在时设置 key 的值:setnx 键 值

  mset:同时设置一个或多个 key-value 对。

  mget:获取所有(一个或多个)给定 key 的值。

  msetnx:同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在(如果存在key,则都不会操作,因为msetnx是原子性型操作)。
  getset:将给定 key 的值设为 value ,并返回 key 的旧值(old value)。简单一句话,先get然后立即set。

1.String数据结构为简单的动态字符串,是可以修改的字符串,类似于java的arrayList

2.当字符串长度小于1M时,扩容都是加倍的,如果超过1M,扩容一次只会增加1M,最多不超过512M


2.2.2 列表

  • list结构为一种快速列表quickList

  • 用来存储多个有序字符串,

  • 一个列表最多可存储232-1个元素。

  • 元素有序,列表元素可重复

操作

lpop/rpop,移除列表key的头/尾元素;

lindex,按照索引下标获得元素(从上到下)(格式:lindex key index);

llen:返回列表 key 的长度(格式:llen key);

lerm:根据参数 count 的值,移除列表中与参数 value 相等的元素(格式: lerm key count value);

- count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。

- count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。

- count = 0 : 移除表中所有与 value 相等的值。

- ltrim ,截取指定范围的值后再赋值给key(格式:ltrim key start stop);

- rpoplpush,移除列表的最后一个元素,并将该元素添加到另一个列表头部并返回(格式:rpoplpush source—key destination—key);

- lset,将列表 key 下标为 index 的元素的值设置为 value(格式:lset key index value);
  linsert,(格式:linsert key before|after pivot value)将值 value 插入到列表 key 当中,位于值 pivot 之前或之后;

- 当 pivot 不存在于列表 key 时,不执行任何操作。
  当 key 不存在时, key 被视为空列表,不执行任何操作。
  如果 key 不是列表类型,返回一个错误。

  

img

性能总结

  • 它是一个字符串链表,left、right都可以插入添加;

  • 如果键不存在,创建新的链表;

  • 如果键已存在,新增内容;

  • 如果值全移除,对应的键也就消失了。

  • 链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。


2.2.3 set

  • 是string类型的无序集合,底层是一个value为null的hash表,所以增删改查复杂度都是O(1)

  • 不允许有重复元素。

  • 一个集合最多可存储232-1个元素。

  • 支持集合内的增删改查,还支持多个集合取交集、并集、差集。

  • 结构和java中的HashSet类似,java中所有value指向一个对象,redis中所有value指向同一个内部值

操作

- sadd key member [member ...]

- smembers key

- sismember key member

- scard:获取集合里面的元素个数(格式:scard key);

- srem:删除集合中元素(格式:srem key member [member ...]);

- srandmember,(格式:srandmember key [count])(不会修改set集合)

- 如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素;
  如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合;

- 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值;

- spop,移除并返回集合中的一个随机元素(格式:spop key);

- smove,(格式:smove source destination member)将 member 元素从 source 集合移动到 destination 集合;

  

  **数学集合类**

- 差集:sdiff(格式:sdiff key [key ...]- 交集:sinter(格式:sinter key [key ...]- 并集:sunion(格式:sunion key [key ...]

2.2.4 hash

  • 是一个键值对集合,特别适合存储对象,类似于java中的Map<String,Object>
  • 是一个String类型的field和value的映射表
  • 当field-value长度短且数量少时,使用ziplist,否则使用hashtable

操作

- hset key field value:将哈希表 key 中的域 field 的值设为 value ;
- hget key field:返回哈希表 key 中给定域 field 的值;
- hmset key field value [field value ...]:同时将多个 field-value (-)对设置到哈希表 key 中;
- hmget key field [field ...]:返回哈希表 key 中,一个或多个给定域的值;
- hgetall key:返回哈希表 key 中,所有的域和值;
- hdel key field [field ...]:删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略;
- hlen,返回哈希表 key 中域的数量(格式:hlen key);
- hexists,查看哈希表 key 中,给定域 field 是否存在(格式:hexists key field);
- hkeys/hvals,格式:
- hkeys key:返回哈希表 key 中的所有域;
  hvals key:返回哈希表 key 中所有域的值;
- hincrby/hincrbyfloat,格式:
- hincrby key field increment:为哈希表 key 中的域 field 的值加上增量 increment;
- hincrbyfloat key field increment:为哈希表 key 中的域 field 加上浮点数增量 increment ;
- hsetnx,将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在(格式:hsetnx key field value)



2.2.5 zset 有序集合

  • 元素不能重复,元素可以排序。

  • 为每个元素设置一个分数作为排序的依据。(分数可以重复)

  • 提供了获取指定分数和元素范围查询、计算成员排名等功能

  • zset底层使用了两个数据结构:

  • 1)hash,hash的作用就是关联元素value和权重score,保障value的唯一性,可以通过value找到相应的score值

  • 2)跳跃表,目的在于给元素value排序,根据score的范围获取元素的列表

操作

- zadd key score member [[score member] [score member] ...]:将一个或多个 member 元素及其 score 值加入到有序集 key 当中;
- zrange key start stop [WITHSCORES]:返回有序集 key 中,指定区间内的成员,其中成员的位置按 score 值递增(从小到大)来排列;
- zrangebyscore:(格式:zrangebuscore key min max [WITHSCORES] [LIMIT offset count]),返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员;
- zrem:移除有序集 key 中的一个或多个成员,不存在的成员将被忽略(格式:zrem key member [member ...]);
- zcard key:返回有序集 key 的基数;
- zcount key min max:返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量;
- zrank key member:返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列,排名以 0 为底,也就是说, score 值最小的成员排名为 0- zscore key member:返回有序集 key 中,成员 member 的 score 值;
- zrevrank:返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序,排名以 0 为底,也就是说, score 值最大的成员排名为 0 (格式:zrevrank key member);
- zrevrange:返回有序集 key 中,指定区间内的成员,其中成员的位置按 score 值递减(从大到小)来排列(格式:zrevrange key start stop [WITHSCORES]);
- zrevrangebyscore:返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列(格式:zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]);
  

3.1 常见的一些配置总结

redis.conf 配置项说明如下:

Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize yes
当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid
指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
port 6379
绑定的主机地址
bind 127.0.0.1
当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 300
指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
loglevel verbose
日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile stdout
设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
databases 16
指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save seconds changes
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
指定本地数据库存放目录
dir ./
设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
slaveof <masterip> <masterport>
当master服务设置了密码保护时,slav服务连接master的密码
masterauth <master-password>
设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
requirepass foobared
设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
maxclients 128
指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory <bytes>
指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly no
指定更新日志文件名,默认为appendonly.aof
appendfilename appendonly.aof
指定更新日志条件,共有3个可选值:
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec
指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
vm-enabled no
虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
vm-swap-file /tmp/redis.swap
将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
vm-max-memory 0
Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值
vm-page-size 32
设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。
vm-pages 134217728
设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
vm-max-threads 4
设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
glueoutputbuf yes
指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)
activerehashing yes
指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
include /path/to/local.conf

第一次配置redis.conf文件建议做以下修改

  1. 将bind 127.0.0.1 -::1注释掉

    这个表示只能本机访问redis,注释后才可以远程访问

  2. 将protected-mod yes改为no

    关闭保护模式

  3. 将deamonize no改为yes

  4. 将logfile “”设置为自己的日志文件保存位置

    例:先在/opt/local/redis目录下创建redis_log.log文件,则设置为

    logfile “/opt/local/redis/redis_log.log”


4.1 发布和订阅

redis的发布和订阅是一种 通信模式,redis的客户端可以订阅任意数量的频道


5.1 jedis连接

## 5.1.2 Jedis是什么

jedis就是基于java语言的redis客户端,集成了redis的命令操作,提供了连接池管理。
redis-cli是redis官方提供的客户端,可以看作一个shell程序,它可以发送命令对redis进行操作。
对于jedis同理是使用java语言操作redis,双方都遵循redis提供的协议,按照协议开发对应的客户端。

Maven依赖

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
        <scope>compile</scope>
    </dependency>
Jedis直连
    //1.生成一个jedis对象,这个对象负责和指定Redis节点进行通信
    Jedis jedis = new Jedis("119.23.226.29", 6379);
    //带密码需要执行认证方法
    //jedis.auth("123456");
    //2.jedis执行set操作
    jedis.set("hello", "world");
    //3.jedis执行get操作,value="world"
    String value = jedis.get("hello");

构造方法参数介绍

img

Maven依赖

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
        <scope>compile</scope>
    </dependency>
Jedis直连
    //1.生成一个jedis对象,这个对象负责和指定Redis节点进行通信
    Jedis jedis = new Jedis("119.23.226.29", 6379);
    //带密码需要执行认证方法
    //jedis.auth("123456");
    //2.jedis执行set操作
    jedis.set("hello", "world");
    //3.jedis执行get操作,value="world"
    String value = jedis.get("hello");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值