Redis基础入门


Redis

Redis简介

Redis是一种数据库,能够存储数据,管理数据的一种软件。

数据库应用的发展历程

单机数据库时代:一个应用,一个数据库实例 缓存、水平切分时代: 读写分离时代 分表分库时代(集群): 关系型数据库: oracle、mysql、DB2、sql server、 非关系型数据库(NoSql):彻底改变底层存储机制。不再采用关系数据模型,而是采用聚合数据结构存储数据 redis、 mongoDB、 HBase.....

Redis的特点

1、支持数据持久化 Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。 2、支持多种数据结构 Redis不仅仅支持简单的key-vale类型的数据,同时还提供ist,set,zset,hash等数据结构的存储。 3、支持数据备份 Redis支持数据的备份,即 master-save模式的数据备份。

Redis的使用

安装

启动

1)前台启动:在任何目录下执行 redis-server 2)后台启动:在任何目录下执行 redis-server & 3)启动 redis服务时,指定配置文件: redis-server redis.conf &

关闭

1)、通过kill命令: ps -ef | grep redis查看pid kill -9 pid 2)、通过 redis-cli命令关闭: redis-cli shutdown

redis客户端

redis的客户端:用来连接 redis服务,向 redis服务端发送命令,并且显示 redis服务处理结果 redis-cli:是 redis自带客户端,使用命令 redis-cli就可以启动 redis的客户端程序 ./mysql -uroot -p redis-cli:默认连接127.0.0.1(本机)的6379端口上的 redis服务 redis-cli -p端口号:连接127.0.0,1(本机)的指定端口上的 redis服务 redis-cli-h ip地址 -p端口:连接指定ip主机上的指定的端口的redis服务

退出 exit或quit

配置文件

redis的配置文件

在 redis根目录下提供 redis.conf配置文件;可以配置一些 redis服务端运行时的一些参数;如果不使用配置文件,那么 redis会按照默认的参数运行,如果使用配置文件,在启动 redis服务时必须指定所使用的配置文件

1)、 redis配置文件中关于网络的配置 port:指定 redis服务所使用的端口,默认使用6379 bind:配置客户端连接 redis服务时,所能使用的ip地址,默认可以使用redis服务所在主机上任何一个ip都可以;一般情况下,都会配置一个ip,而且通常是一个真实 如果配置了port和bind,则客户端连接 redis服务时,必须指定端口和ip

redis-cli -h [bind指定ip] -p [port指定端口号] ​ redis-cli -h [bind指定ip] -p [port指定端口号] shutdown 关闭redis

tcp-keepalive :TCP连接保活策略

Redis常规配置

loglevel:配置日志级别,开发阶段配置debug ,上线阶段配置notice或者warning

logfile:置顶日志文件。redis在运行过程中会出输出一些日志信息,默认情况下,这些日志信息会输出到控制台,我们可以使用logfile配置日志文件,使redis把日志信息输出到指定文件中,指定的文件可以不存在,目录必须存在。

databases:配置redis服务默认创建的数据库实例,默认是16个

Redis安全配置

requirepass : 配置redis 的访问密码,默认不使用。此参数必须在protected-mode = yes 时才起作用 一旦设置了密码验证,客户端连接redis服务时候,必须使用密码连接,redis-cli -h ip -p port -a pwd

 

1、测试reids性能 redis-benchmark

2、ping查看redis服务是否正常运行 返回Pong 说明正常

3、查看redis服务器的统计信息 info 查看redis服务器的所有信息 info [信息段] 查看redis服务器的指定统计信息,如:info Replication

4、redis的数据库实例 作用类似于mysql的数据库实例,reids中的数据库实例只能由redis服务创建和服务,开发人员不能修改和自行创建数据库实例,默认情况下,redis会自动创建16个数据库实例,并且给这些数据库实例进行编号,从0开始,一直到15,使用时通过编号来使用数据库;可以通过配置文件,指定redis自动创建数据库个数;redis的每一个数据库实例本身占用的存储空间是很少的,所以也不会造成存储空间的太多浪费 默认情况下,redis客户端连接的是编号是0 的数据库实例;

5、查看当前数据库实例中所有key的数量:dbsize

6、查看所有key:keys *

7、清空当前数据库实例的数据:flushdb

8、清空所有的数据库实例的数据:flushall

9、查看redis的所有的配置信息:config get * 查看redis 的指定配置信息:config get [信息名]

redis的五种数据结构

程序是用来处理数据的,Redis是用来存储数据的,程序处理完的数据要存储到redis中,不同特点的数据要存储在Redis中不同类型的数据结构中。

数据类型  
字符串zahngsan 20 trueString(单key : 单value)
list列表13333333333 zs@163.com 321321list(单key : 多value 有序)
set集合shanghai zhengzhou tianjing suzhouset(单key : 多value 无序)
pojoid:1001,name:zhangsan,age:20hash(单key : 对象[属性:值] 无序)
  zset(单key : 多value 可排序)

redis中操作命令

有关key 的操作命令

keys [pattern] 查看数据库中的key
keys * :查看所有的key, keys k*:查看数据库中所有以k开头的key keys h*l:查看数据库中所有以h开头l结尾的key keys h?l:查看数据库中所有以h开头l结尾,且中间只有一个字符的key keys h[abc]llo:查看数据库中所有以h开头,llo结尾,且h后面只能取abc中的一个字符的key

exists key 判断key在数据库中是否存在,如果存在则返回1,反之,返回0 exists key [key1 key2 key3] 返回key存在的数量 exists k1 exists k1 k2 k3 hello

move key index:移动指定key到指定的数据库实例中 move k 1 :将key为k的数据移动到1号数据库实例中

ttl:查看指定key的剩余生存时间,如果不存在key,返回-2,如果key没有设定生存时间,返回-1

expire key seconds:设置key的最大生存时间 expire hello 20

type key : 查看指定key的数据结构类型

rename key newkey : 重命名key

del key : 删除指定的key del key [key1 key2 key3] :删除多个key,返回值是删除成功的数量

有关string类型数据的操作命令

set 键 值 : 将string类型的数据放置到redis中,set 键 值,如果key已存在,则覆盖 set name zhangsan set age 20 set totalRows 100

get key : 获取string类型的数据 get name get age get totalRows

append key value :追加字符串,返回追加之后的字符串长度,如果key不存在,则相当于set

strlen key : 获取字符串长度

incr key :将字符串数值进行加1运算,返回加后的结果,如果key不存在,则设置该key,初始化为0,进行加1

decr key : 将字符串数值进行减1运算,

incrby key offset : 将字符串数值进行加offset运算

decrby key offset :将字符串数字进行减offset运算

getrange key startIndex endIndex :获取字符串中的子字符串,自左向右,最左边的下标是0, 自右向左,最右边的下标是-1

hello: wrod ​ getrange hello 1 3 返回 rod ​ getrange hello 1 -1 返回 rod ​ getrange hello 0 -1 返回 wrod

setrange key offset value :用value 覆盖下标为offset开始的字符串

setex key seconds value :设置字符串数据的同时,设置他最大生命周期

setnx key value :设置一个不存在的key,成功返回1,失败,返回0

mset key value [key1 value1 key2 value2 .....] : 批量设置key

mget key [key1 key2 key3] : 批量获取指定key的值

msetnx key value [key1 value1 key2 value2 .....] :批量设置不存在的key,当所有key均不存在,设置成功,反之失败

有关list类型数据的操作命令

lpush key element [element.....] :将一个或者多个值依次插入到列表的表头 lpush list 1 2 3 4 = 4 3 2 1

rpush key element [element.....] :将一个或者多个值依次插入到列表的表尾

lrange key start stop :获取指定列表中指定下标区间的元素 lrange list 0 -1 = 4 3 2 1

lpop key [count] :从指定列表中移除指定个数的,表头元素,并返回表头元素

rpop key [count] :从指定列表中移除指定个数的,表尾元素,并返回表尾元素

lindex key index :获取指定列表,指定下标元素

llen key : 获取指定列表的长度

lrem key count element :根据count的值,来移除列表指定数据 lrem list 2 1 从列表左侧开始删除两个1 lrem list -2 1 从列表右侧开始删除两个1 lrem list 0 1 从列表删除所有的1

ltrim key start stop :截取指定列表中指定下标区间的元素组成的新列表,并赋值给key lpush list 1 2 3 4 5 6 7 结果 7 6 5 4 3 2 1 ltrim list 1 -2 结果6 5 4 3 2

lset key index element : 更改将指定列表中指定下标的值

linsert key BEFORE|AFTER pivot element :将element 插入到指定列表中位于pivot元素之前/之后的位置

有关set类型数据的操作命令

sadd key member [member....] : 将一个或多个元素添加到指定set中,元素有重复,则忽略。

smembers key :获取指定set中的所有元素

sismember key member:判断元素是否在指定set中存在,返回1 则存在,0则不存在

scard key :获取指定集合的长度

srem key member [member ...] :移除指定集合中的一个或者多个元素,不存在的元素会被忽略,返回成功移除的个数

srandmember key [count]:随机获取指定集合中一个或count个元素, count为正数时,获取的多个元素之间不重复 count为负数时,获取的多个元素之间可能重复

spop key [count] : 随机移除一个或多个元素

smove source destination member : 将指定集合中的指定元素移动到另一个集合 smove set set1 zhanggei :将set中的zhangei元素移动到set1中

sdiff key [key ...] :差集 :返回 属于第一个key,但不属于 其他key 的 元素

sinter key [key ...] : 交集 :返回所有指定集合都有的元素

sunion key [key ...] : 并集 :返回指定的所有key元素

有关hash类型数据的操作命令

hset key field value [field value ......] :将一个或者多个field-value设置到哈希表中 hset hash name zhangsan age 20

hget key field :获取一个哈希表里的field的值 hget hash name hget hash age

hmset key field value [field value ......] :批量设置多个field-value对到哈希表中

hmget key field [field] :批量获取指定key 的field的值

hgetall key :获取指定哈希表中所有的field 和 value

hdel key field [field ....] :删除指定哈希表中指定field

hlen key :获取指定哈希表的filed个数

hexists key field :判断指定哈希表中是否存在某一个field

hkeys key :获取指定哈希表中所有的field列表

hvals key : 获取指定哈希表的所有field

hincrby key field increment :对指定哈希表中的指定field进行整数加法运算

hincrbyfloat key field increment : 对制定哈希表中的指定field进行浮点数加法运算

hsetnx key field value :将一个field - value 设置到哈希表中,如果field已经存在,放弃设置,反之设置

有关zset 类型数据的操作命令

zset每一个元素都要关联一个分数,redis 会根据分数对元素进行自动排序,分数可以重复,元素不能重复,每个元素都有下标

zadd jet [NX|XX] [GT|LT] [CH] [INCR] score member | score member ... :讲一个或者多个member及其score值加入有序集合,如果元素已存在,则分数覆盖 zadd score 100 zhangsan 80 lisi 72 zhaosi 70 wangwu 60 wanglu

zrange key min max [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES] :获取指定有序集合中指定下标区间的元素 zrange score 0 -1 zrange score 0 -1 withscores : 附带分数

zrangebyscore key min max [WITHSCORES] [LIMIT offset count] :获取指定有序集合中指定分数区间的元素

zcard key :获取指定有序集合中所有元素的个数

zrank key member :获取指定有序集合中指定元素的排名

zrevrank key member :获取指定有序集合中指定元素的排名(从大到小),rev代表相反,在其他zset命令道理同等

zcount key min max :获取指定有序集合中分数在指定区间内的元素的个数

zscore key member : 获取指定有序集合中指定元素的分数

zrem key member [member ...] :删除指定有序集合中一个或者多个元素

 

Redis持久化

redis 提供持久化策略,在适当的实际采用适当的手段把内存中的数据持久化到磁盘中,每次redis服务启动时,都可以吧磁盘上的数据再次加载到内存中使用。

1、RDB策略:在指定时间间隔内,redis服务执行指定次数的写操作,会自动触发一次持久化操作,RDB策略是redis默认的持久化策略,redis服务开启时,该策略也跟着默认启动。 ​ save :配置持久化策略 ​ dbfilename:配置redis RDB持久化数据存储的文件 ​ dir:配置redis RDB持久化文件所在目录

2、AOF策略:采用操作日志来记录进行每一此写操作,每一次启动redis,都会重新执行一遍操作日志中的指令,redis默认不开启AOF功能。 ​ appendonly:配置是否开启AOF策略 ​ appendfilename:配置操作日志文件

小结:根据数据的特点,决定开启那总持久化策略,一般情况下,开启RDB足够了

Redis的事务

事务:把一组数据库命令放在一起执行,保证操作原子性,要么同时成功,yao'm同时失败

Redis事务:允许把一组redis命令放在一起执行,把命令进行序列化,然后一起执行,保证部分原子性,

multi:用来标记一个事务的开始;之后每一次操作,都会放入队列中,不会立刻执行

exec:执行一个事务,用来执行事务队列中的所有操作 如果一组命令中,在压入事务队列过程中就发生的错误的命令,则本事务的所有命令都不执行,能够保证事务的原子性。

如果一组命令中,在压入队列过程中正常,的男士在执行事务队列过程中某一条命令发生的错误,则只会影响发生错误的命令,不会影响其他命令的执行,不能够保证事务的原子性。

discard:清除所有已经压入队列的命令,并且结束整个事务

watch :监控某一个键,当事务在执行过程中,此键代码的值发生变化,则本事务放弃执行,否则正常执行

unwatch:放弃监控所有的键

小结

1、单独的隔离操作:事务中的所有命令都会序列化、顺序地执行。事务在执行过程中,不会被其它客户端发来的命令请求所打断

2、不保证事务的原子性:redis同一个事务中如果一条命令执行失败,其后的命令仍然可能会被执行,reds的事务没有回滚。 Redis已经在系统内部进行功能简化,这样可以确保更快的运行速度,因为Reds不需要事务回滚的能力。

redis消息的发布与订阅

redis客户端订阅频道,消息的发布者往频道上发布信息,所有订阅此频道的客户端都能够接好到信息。

subscribe channel [channel ...] :订阅一个或者多个频道的消息 subscribe s1 s2 s3

psubscribe pattern [pattern ...] :订阅一个或者多个频道的信息,频道名支持通配符 psubscribe news.*

publish channel message:将消息发布到指定的频道 publish s1 xinxi

redis的主从复制

主从复制

主机数据更行后根据配置和策略,自动同步到从机的master/slave机制,Master以写为主,Slave以读为主。

查看三台redis服务在集群中的主从角色 info replication 默认情况下,所有的redis服务都是主机

设置主从关系 在6380上执行:slaveof 127.0.0.1 6379 :从属于某一个redis服务,从机不能进行写操作,但是可以读。

全量复制:一旦主从关系确定,主机会将自己的数据同步到从机上

增量复制:主机写数据会自动到从机

主机宕机

如果主机宕机,从机原地待命,仍然可以进行读操纵。当主机上线后,恢复正常

从机宕机

如果从机宕机,其他从机不受影响,主机的从机数量减一,当从机恢复,则主从关系失效,需要重新设置主从关系。

从机上位

从机断开原来的主从关系,slaveof no one 将其他从机从属于新主机,slaveof ip port

如果原来主机恢复,可以重新设置为主机,也可以设置为从机,或者为从机的从机

小结

一台主机配置堕胎从机,一台从机又可以配置多台从机,从而形成一个庞大的集群结构。减轻一台主机的压力,但是增加了服务间的延迟时间

Redis哨兵模式

主机宕机、从机自动上位

提供哨兵配置文件

在redis安装目录下创建配置文件: redis_sentinel.conf,编辑内容

sentinel monitor dc-redis 127.0.0.1 6379 1
表示,指定监控主机的ip地址,port端口,得到哨兵的投票数(当某一个从机得到的票数大于或等于次数时,切换从主关系)

启动哨兵 : redis-sentinel /redis目录/redis_sentinel.conf

redis-sentinel redis_sentinel.conf

主机宕机,哨兵选择一个从机上位,之前主机恢复,自动从属于新的主机

Jedis操作Redis

使用Redis官方推荐的Jedis,在java应用中操作Redis,Jedis几乎涵盖了Redis的所有命令,操作Redis的命令在Jedis中以方法的形式出现

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.6.3</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.25</version>
</dependency>
@Test
public void test1(){
    //连接redis
    Jedis jedis = new Jedis("114.215.172.169",6379);
    String ping = jedis.ping();
    System.out.println(ping);
    String set = jedis.set("name", "zhangsan");
    System.out.println(set);
    Set<String> keys = jedis.keys("*");
    for (String key : keys) {
        System.out.println(key);
    }

    Boolean name = jedis.exists("name");
    System.out.println(name);
}

 

声明:冰醋酸|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - Redis基础入门


一切随缘