1.Redis
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
2.Redis安装
1.windows安装
下载官方文件之后,安装即可。
在命令窗口输入命令
redis-cli
- 设置远程访问
2.linux安装
- 下载安装包解压,解压完毕在文件夹内打开命令窗口
#输入命令
make
#完毕之后在当前窗口输入新的命令
sudo make install
- 设置redis在后台运行
-
启动和关闭redis服务
#启动redis服务
./redis-server redis.conf
#查看redis服务进程 是否启动成功
ps -ef | grep redis
ps -A | grep redis
#redis客户端启动
redis-cli
#关闭redis服务
ps -A | grep redis
3.redis常见配置
- 配置文件redis.conf
- 常见配置项
- bind 127.0.0.1 [绑定ip地址,远程访问请注释]
- port 6379 [默认访问地址 6379]
- daemonize yes [是否以后台进程<守护进程>运行]
- dbfilename dump.rdb [存储数据的文件]
- dir ./. [存储数据的文件所在路径]
- redis中的数据类型
- redis的数据存储:key=value 键值对
- key<键>的数据类型:字符串
- value<值的类型>:
- string字符串
- hash哈希
- list列表
- set集合
- zset有序集合
4.redis数据操作
- string:字符串操作
set key value :给一个key赋值value
setex key seconds value:给一个key设置值value,过期时间seconds
mset key value [key value]:设置多个键值对get key:根据key获取一个值
mget key [key]:根据多个key获取多个值incr key :将key对应的值+1
incrby key increment:将key对应的值+increment
decr key:将key对应的值-1
decrby key increment:将key对应的值-incrementappend key value:将value的值拼接到x后面
strlen key:获取key对应的值的长度
- key操作
keys pattern:查找键,支持正则
exists key:查找键是否存在,存在返回1,否则返回0
type key:查看键对应的值的类型
del key:根据key删除键值对
expire key seconds:给key设置过期时间
ttl key:查看键的有效时间(显示结果为-2 的话表示过期,-1表示永不过期)
- hash:用于存储对象,对象的格式为键值对
hset key field value:设置单个属性
hmset key field value [field value]:设置多个属性hget key field :获取key对应的值
hmget key field [field]:获取多个key对应的value值
hgetall key:获取所有属性和值
hkeys key:获取所有的属性
hlen key:获取包含属性的个数
hvals key:获取所有的值
hexists key field:判断属性是否存在
hdel key field [field]:根据属性名称删除属性及值
hstrlen key field:返回值的字符串长度
- list列表:有序存储多个数据
lpush key value [value]:列表头部增加多个数据
rpush key value [value]:列表尾部增加多个数据
linsert key before | after privot value:在一个元素钱/后插入数据
lset key index value:设置指定索引的元素的值lpop key:删除并且获取key对应的list第一个元素
rpop key:删除并且获取key对应的list最后一个元素
lrange key start stop:返回存在在key的list中指定范围的数据llen key:获取列表的长度
lindex key index:获取列表中索引对应的元素
ltrim key start stop:获取列表中start~stop组成的新的列表
- set集合:无序存储多个数据
sadd key value [value]:添加多个数据到key集合中
smembers key:获取key集合中所有的数据
sismember key value:判断value是否在key集合中存在
scard key:获取key集合中元素的个数sinter key [key]:获取多个集合 交集
sdiff key [key]:获取多个集合的差集
sunion key [key]:获取多个集合的并集
- zset集合:有序存储多个数据
- sorted set,有序集合
- 元素为string类型
- 元素具有唯一性,不重复
- 每个元素都会关联一个double类型的score,表示权重,通过权重将元素从小到大排序
- 元素的score可以相同
zadd key score value [ score value]:添加多个带权重的数据到key集合中
zrange key start stop:获取指定范围中所有的元素
zcard key:返回元素的个数
zcount key min max :返回score值在min和max之间的数据
zscore key member:返回集合中member元素的score值
5.redis发布订阅
- 发布者不是计划发送消息给特定的接收者(订阅者),而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅
- 订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的
- 发布者和订阅者的解耦合可以带来更大的扩展性和更加动态的网络拓扑
- 客户端发到频道的消息,将会被推送到所有订阅此频道的客户端
- 客户端不需要主动去获取消息,只需要订阅频道,这个频道的内容就会被推送过来
- 消息的格式
推送消息的格式包含三部分
part1:消息类型,包含三种类型
- subscribe,表示订阅成功
- unsubscribe,表示取消订阅成功
- message,表示其它终端发布消息
如果第一部分的值为subscribe,则第二部分是频道,第三部分是现在订阅的频道的数量
如果第一部分的值为unsubscribe,则第二部分是频道,第三部分是现在订阅的频道的数量,如果为0则表示当前没有订阅任何频道,当在Pub/Sub以外状态,客户端可以发出任何redis命令
如果第一部分的值为message,则第二部分是来源频道的名称,第三部分是消息的内容
subscribe 频道名称 [频道名称]:订阅多个频道
unsubscribe 频道名称 [频道名称]:取消多个频道的订阅
publish 频道 消息:向指定的频道推送消息
打开多个命令窗口:
- 第一个窗口当做订阅者
输入命令:
#启动redis redis-cli #选择数据库 select 0 #订阅频道 subscribe zhiji
- 第二个窗口当做客户端
输入命令
#启动redis redis-cli #选择数据库 select 1 #发布消息 publish zhiji 'hellow'
6.主从双备
主从配置
一个master可以拥有多个slave,一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构
比如,将ip为192.168.1.10的机器作为主服务器,将ip为192.168.1.11的机器作为从服务器设置主服务器的配置
bind 192.168.1.10 设置从服务器的配置
注意:在slaveof后面写主机ip,再写端口,而且端口必须写
通过redis.**.conf配置完成主从双备
bind配置主数据库服务器
slaveof配置从数据库服务器
bind 192.168.1.11 slaveof 192.168.1.10 6379 在master和slave分别执行info命令,查看输出信息
在master上写数据
set hello world 在slave上读数据
get hello