Redis学习


Remote Dictionary Server(远程字典服务器),是一个用C语言编写的,开源的,基于内存并支持持久化的,高性能NoSQL数据库.

Redis数据大部份时间都是存储内存中,适合存储频繁访问,数据量小的数据

Redis的特点

1. 支持数据持久化
Redis支持数据的持久化,可以将数据保存到磁盘中,重启的时候可以将数据再次加载进行使用

2.支持多种数据类型
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,hash,zset等数据结构的存储

3.支持数据备份
Redis支持数据的备份,即master-slave模式的数据备份

启动Redis服务:

  1. 前台启动
redis-server
  1. 后台启动
redis-server &
  1. 启动Redis服务时,指定配置文件
redis-server redis.conf &

关闭Redis服务

  1. 通过杀进程
ps -ef | grep redis
kill -9 pid
  1. 通过redis-cli命令关闭
redis-cli shutdown

Redis的客户端:用来连接redis服务,向redis发送命令,并且显示redis服务处理结果.
redis-cli:是Redis自带的客户端,使用redis-cli就可以启动redis客户端程序

redis-cli -h host -p port

退出客户端

exit

Redis基本知识

  1. 测试Redis服务的性能
redis-benchmark
  1. 查看redis是否正常,使用客户端连上Server,ping返回pong表示正常
ping
  1. 查看Redis服务器统计信息
info 全部信息
info [信息段] 查看Redis服务器指定的统计信息'
info Replication 集群

Redis的数据库实例:类似MySQL的数据库实例,Redis的数据库实例只能由Redis服务来创建和维护开发人员不能修改和创建数据库实例;默认情况下Redis会自动创建16个数据库实例,并且给这些数据库实例进行编号,从0开始,一直到15,使用编号来使用数据库;可以通过配置文件来指定Redis自动创建数据库的个数.Redis中每个数据库本身占用的内存空间,不会造成太多浪费.
Redis客户端默认登录是0号数据库,可以使用select index来切换数据库实例

select index
  1. 查看当前数据库实例中数据的条数,key的数量
dbsize
  1. 查看当前数据库实例中所有的key
keys *
  1. 清空数据库实例
flushdb
  1. 清空所有数据库实例
flushall
  1. 查看Redis中所有配置信息
config get *
config get parameter

Redis的五种数据结构

程序是用来处理数据的,Redis是用来存储数据的;程序处理完的数据要存储到redis中,不同特点的数据要存储在Redis中不同类型的数据结构中.
字符串: 单key-单value
list列表: 单key-多有序value
set集合: 单key-多无序value
zset: dankey-多有序value
hash: 单key-对象(属性:值)
1. 字符串类型string
字符串类型是Redis中最常用的数据类型,它能存储任何数据类型的数据,包括二进制数据,序列化后的数据,JSON化后的对象甚至是一张图片.最大512M
string
2. 列表类型
Redis列表是简单的字符串列表,按照插入顺序,元素可以重复.可以添加一个元素到列表的头部(左边)或者尾部(右边),底层是个链表结构
list
3.集合类型
Redis的set是string类型的无序无重复集合
set

4. 哈希类型 hash
hash是一个string类型的field和value的映射表,hash特别适合用于存储对象类型
hash
5.有序集合
Redis有序集合zset和set一样也是string类型的集合,且不允许重复的成员.不同的是zset每个元素都会关联一个分数(分数可以重复),redis通过分数来为集合中的成员从小到大排序
zset

Redis的常用操作命令

Redis的key的操作命令
  1. 查看数据库中的key
keys pattern

作用:查找所有符合模式的pattern的key.pattern可以使用通配符
通配符:

  • *: 表示0或多个字符,例如:keys 查询所有的key keys p查找p打头的所有key
  • ?: 表示单个字符;例如:wo?d,匹配word,wood
  • [] :表示选择[]内的一个字符,例如wo[or]匹配word wood 不匹配world wooord
  1. 判断key在数据库中是否存在
  • exists key存在返回1,不存在返回0
  • exists key[key key key…]返回值是存在key的数量
	exists key
  1. 移动指定数据到指定数据库实例
move key index
  1. 查看key的剩余生存时间
  • 如果key没有设置生存时间,返回-1
  • 如果key不存在返回-2
ttl key
  1. 设置key的最大生存时间
expire key seconds
  1. 查看指定key的数据类型
type key
  1. 重命名key
rename key newkey
  1. 删除key
    del [key key key…] 返回实际删除key的数量
del key
Redis关于string类型的操作命令
  1. 将string类型的数据保存到redis中,如果key已经存在则覆盖原来的value
set key value
  1. 从redis中获取string类型的数据
get key
  1. 追加字符串
  • 如果key存在,返回追加之后的字符串长度
  • 如果key不存在,则新设置key-value
append key value
  1. 获取字符串长度
strlen key
  1. 将字符串数值进行加1运算
  • 如果key存在,返回加1运算后的结果
  • 如果key不存在,首先设置一个key,值初始化0,然后进行incr运算
  • 要求key对应的value必须为数值,否则报错
incr key
  1. 将字符串数值进行减1运算
  • 如果key存在,返回减1运算后的结果
  • 如果key不存在,首先设置一个key,值初始化0,然后进行decr运算
  • 要求key对应的value必须为数值,否则报错
decr key
  1. 将字符串数值进行加offset运算
  • 如果key存在,返回加offset运算后的结果
  • 如果key不存在,首先设置一个key,值初始化0,然后进行incrby运算
  • 要求key对应的value必须为数值,否则报错
incrby key offset
  1. 将字符串数值进行减offset运算
  • 如果key存在,返回减offset运算后的结果
  • 如果key不存在,首先设置一个key,值初始化0,然后进行decrby运算
  • 要求key对应的value必须为数值,否则报错
decrby key offset
  1. 闭区间获取字符串key中从startIndex到endIndex的字符组成的子字符串,从0开始,正下标表示自左向右,负下标表示自右向左,最右边 一个下标为-1
getrange key startIndex endIndex
  1. 用value覆盖从下标为startIndex开始的字符串
setrange key startIndex value
  1. 设置字符串的同时设置过期时间
setex key seconds value 
  1. 设置string的数据到redis中,当key不存在时设置成功,否则放弃设置
setnx key value
  1. 批量设置string类型到redis
mset key1 value1 key2 value2...
  1. 批量获取string类型的shuju
mget k1 k2...
  1. 批量设置string类型到redis,当所有key都不存在时设置成功,有一个存在则全部放弃
msetnx k1 v1 k2 v2...
Redis关于list类型的操作命令

list:单个key对应多个有序value,最左侧是表头,最右侧是表尾

  • 每一个元素都有下标,表头元素的下标是0,依次往后排序,最后一个元素下标是列表长度-1
  • 每一个元素的下标又可以用负数表示,负下标表示从表尾计算,最后一个元素下标为-1
  • 元素在列表中的顺序由放入顺序决定
  1. 将一个或者多个值依次插入列表的表头(左侧)
lpush key value [v1 v2 v3..]
  1. 获取指定列表指定区间内的元素
lrange key start stop
  1. 将一个或者多个值依次插入列表的表尾(右侧)
rpush key value [v1 v2 v3..]
  1. 从指定列表弹出表头(左侧)元素
lpop key
  1. 从指定列表弹出表尾(右侧)元素
rpop key
  1. 获取指定列表中指定下标的元素
lindex key index
  1. 获取指定列表的长度
llen key
  1. 移除指定列表中某一些数据 (和value值相同的元素)
  • count>0从列表左侧移除count个跟value值相等的元素
  • count<0从列表右侧移除count个跟value值相等的元素
  • count=0从列表移除所有和value值相等的元素
lrem key count value
Redis关于set类型的操作命令

一个key对应多个无序无重复value

  1. 将一个或多个元素添加进set
  • 如果已经存在则不添加,返回成功加入的元素个数
sadd key value [v1 v2 v3...]
  1. 获取指定集合中所有元素
smembers key
  1. 判断指定元素在指定set中是否存在
sismember key member
  1. 获取指定集合的长度
scard key
  1. 移除指定集合中一个或多个元素
srem key member[m1 m2 m3...]
  1. 随机获取指定集合中的一个元素
  • count>0 从这个集合中随机获取count个元素,这多个元素不能重复
  • count<0 从这个集合中随机获取count个元素,这多个元素可以重复
srandmember key [count]
  1. 随机从指定集合中移除一个或多个元素
spop key [count]
  1. 将指定集合中的指定元素移动到目标集合中
smove source dest target
  1. 获取一个集合中有其他集合中都没有的元素组成的新集合
    求差集
sdiff key key [k1 k2 k3]
  1. 获取所有指定集合中都有的元素组成的新集合
    求交集
sinter k [key1 key2 key3]
  1. 获取指定集合中,所有元素组成的集合
sunion key1 key2 key3...
Redis关于hash类型的操作命令

单key:
field-value
field-value

student:id-1
name-张三
age-20

  1. 将一个或多个filed-value对设置到hash中
hset key field-value[field-value...] 
  1. 获取指定hash表中指定field的值
hget key field
  1. 批量将多个filed-value对设置到hash中
hmset  key field-value[field-value...] 
  1. 批量获取指定哈希表中多个field的值
hmget key field1 field2...
  1. 获取指定hash表中所有的field和value
hgetall  key
  1. 从指定哈希表中删除一个或多个field
hdel key field [f1 f2]
  1. 获取指定hash表中field的个数
hlen key
  1. 判断指定hash表中是否存在某一field
hexists key field 
  1. 获取指定哈希表中所有field的列表(类似hashmap的keyset)
hkeys key
  1. 获取指定hash表中所有的value的列表
hvals key
  1. 对指定哈希表中指定field值进行整数加法运算
hincrby  key field int
  1. 对指定哈希表中指定field值进行浮点数加法运算
hincrbyfloat  key field float
  1. 将一个filed-value对设置到hash中,如果已存在则设置失败

Redis配置文件

在redis根目录下提供redis.conf配置文件,可以配置redis服务端运行的一些参数

  • 如果不使用配置文件,Redis按照默认参数运行
  • 如果使用配置文件,在启动redis服务时必须指定所使用的配置文件
  1. redis配置文件中关于网络的配置
  • port: 指定Redis服务所使用的端口,默认6379
  • bind: 客户端连接Redis服务时,所能使用的ip地址,默认可以使用Redis服务所在主机上任何一个IP都可以;一般情况下,都会配置一个IP,而且通常是一个真实IP.
  • 如果配置了port和bind,则客户端连接Redis服务时,必须指定端口和IP
redis-cli -h host -p port
redis-cli -h host -p port shutdown
  1. 常规配置
  • loglevel: 配置日志级别.
  • logfile: 指定日志文件.
  • databases: Redis默认创建数据库实例个数
  1. 安全配置
requirepass password
protected-mode=yes
redis-cli -h host -p port -a password

Redis持久化策略

Redis是内存数据库,他把数据存到内存中,这样加快了读取速度的同时也带了数据的安全性问题,即当Redis服务器发生宕机后,Redis数据库里的数据将全部丢失.为了解决这个问题Redis提供了持久化功能—RDB和AOF(Append Only File)

RDB

RDB(Redis DataBase) 是Redis默认的持久化方案.在指定时间内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中.即在指定目录下生成一个dump.rdb文件.Redis重启会通过加载dump.rdb文件来恢复数据.

RDB原理
Redis会复制一个与当前进程一样的进程.新的进程的所有数据(变量,环境变量,程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程,来进行持久化
整个过程主进程是不进行任何I/O操作的,这就确保了极高的性能
如果需要大规模数据恢复,且对数据恢复的完整性不是非常敏感.那RDB方式要比AOF方式更加高效,RDB的缺点是最后一次持久化之后的数据可能丢失

save <seconds> <changes>

配置符合快照触发条件,即Redis在seconds秒内key改变了changes次,Redis把快照的数据保存到磁盘一次
默认策略如下:
Redis持久化策略

如果要禁用掉Redis持久化功能,则把所有的save配置都注释掉

  • dbfilename: 默认dump.rdb
  • dir: 持久化路径
AOF

采用操作日志记录进行每一次写操作,每次Redis服务启动的时候,都会重新执行一遍操作日志的指令
效率低下,默认关闭
AOF 配置

  1. appendonly: 配置是否开启AOF,yes表示开启,no表示关闭,默认关闭
  2. appendfilename:AOF保存文件名
  3. appendsync:AOF异步化策略
  • always:同步持久化,每一次发生数据变化会立刻写入到磁盘中,性能较差但是数据完整性较好(慢 安全)
  • everysec:出厂默认推荐,每秒异步记录一次
  • no: 不即时同步

Redis的事务

事务: 把一组数据库命令放在一起执行,保证原子性,要么同时成功要么同时失败
Redis的事务:允许把一组Redis命令放在一起,把命令进行序列化,然后一起执行,保证原子性

  1. multi : 用来标记一个事务的开启
    //TODO

Redis消息发布订阅

Redis客户端订阅频道,消息的发布者往频道上发布消息,所有订阅此频道的客户端都能收到消息

  1. 消息的订阅
subscribe channel
  1. 消息的发布;可以将消息发布到指定频道
publish
  1. 订阅一个或多个频道的消息,频道支持通配符
psubscribe channel*

Redis集群

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

Redis主从复制: 主少从多,主写从读,读写分离,主写同步复制到从

配置:

  1. 配从(库)不配主(库)
  2. 配从库: salveof 主库IP 主库端口
  3. 主写从读, 读写分离
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值