redis简介
redis是一种基于key-value的NoSQL数据库,和memcached类似,只不过它支持的值类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)、hash(哈希类型)等多种数据结构和数据算大组成。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中,所以它的读写性能非常的强大。不仅如此,redis还可以将内存中的数据利用快照和日志的形式保存到磁盘上,并且在此基础上实现了master-slave(主从)同步。
redis重要的特性
-
速度快
redis所有的数据都缓存在内存中
redis使用C语言实现
redis使用单线程框架 -
key-value型数据结构服务器
多种数据结构(字符串、哈希、列表、集合、有序集合) -
主从复制
-
自带高可用和分布式
哨兵
集群 -
支持数据持久化
RDB和AOF -
丰富的功能
提供了键过期功能(优惠券期限),可以实现缓存
提供了发布订阅功能,可以实现消息系统
提供pipeline功能,客户端可以一次性将一批命令传到redis,减少的网络开销 -
简单稳定
源码很少。3.0版本后,代码在5万行左右
使用单线程模型法。使得redis服务端处理模型变得简单
不依赖操作系统中的类库 -
多种客户端语言
PHP、Java、Python、C、C++、Nodejs等
redis应用场景
-
缓存—键过期
缓存session会话
缓存用户信息。缓存中没有数据才去请求后端数据库,查到再返回给用户,同时保存到本地 -
排行榜—列表&有序集合
热度排名排行
发布时间排行
浏览记录 -
计数器应用
视屏播放次数
商品浏览量 -
社交网络—集合
过滤共同习惯/爱好,推送,推广
-
消息队列系统—发布订阅
配合ELK实现日志收集
-
购物车应用
添加购物车(哈希)——hincrby
勾选状态(集合)——sadd
安装redis
- 规划目录
mkdir -p /opt/redisCluster/6379/{data,conf,log,pid}
- 下载软件
wget http://download.redis.io/releases/redis-4.0.11.tar.gz
- 解压文件
tar xf redis-4.0.11.tar.gz -C /opt/redisCluster/
- 做软连接
ln -s /opt/redisCluster/redis-4.0.11/ /opt/redisCluster/redis
- 下载依赖文件
yum install -y gcc gcc-c++
- 安装
make && make install
- 配置文件(多实例仅需多个目录和多个配置文件)
daemonize yes
port 6379
logfile /opt/redisCluster/6379/log/redis_6379.log
dir /opt/redisCluster/6379/data
dbfilename dump.rdb
bind 192.168.8.19 127.0.0.1
pidfile /opt/redisCluster/6379/pid/redis_6379.pid
loglevel notice
masterauth 123
requirepass 123
- 启动
/opt/redisCluster/redis/src/redis-server /opt/redisCluster/6379/conf/redis_6379.conf
- 登录
redis-cli -a password -h 127.0.0.1 -p 6379
全局命令
redis有5中数据结构,它们是键值对中的值,对于键来说有以下一些通用的命令:
- 查看所有命键
keys * //谨慎使用
- 查看键的总数
dbsize
- 检查键是否存在
exists key
删除键
del key
设置键过期
expire key seconds
//当超过过期时间后,会自动删除键
//通过ttl命令查看键的剩余时间
ttl返回值
-1:键永不过期
-2 键不存在
- 查看键的数据类型
type key
数据类型
redis并不是简单地key-value存储,实际上它是一个数据结构服务器,支持不同类型的值。
字符串
字符串是redis中最简单的数据类型,如果只用这种数据类型redis就像一个持久化的memcache服务器
操作命令:
设置字符串值
set key value
获取字符串值
get key
多个key操作
mset key value key2 value2
mget k1 k2 k3
计时器
incr k1
incr k1 100 //直接设置加100
设置过期时间
expire k2 100
查看过期时间
ttl k1 //如果对一个设置了键过期的key重新set一个值那么该键永不过期
取消过期时间
persist k2
列表
redis列表是最简单的字符串列表,按照插入顺序,你可以从左边或者右边添加一个元素。
//lpush可向list的左边添加一个新元素
lpush list 1
//rpush可向list的右边添加一个新元素
rpush list 2
//lrange可以从list中取出一定范围的元素
lrange key start stop
哈希
哈希由(key-value)键值对组成。可以作为MySQL的缓存使用
//hmset命令设置hash中的多个域
HMSET id:100 name xm age 123 job ops
//hget 取回单个域
hget id:100 name
hmget 取回一系列的值
HMGET id:100 name age job
//hgetall 取回所有值
HGETALL id:100
集合
集合是字符串的无序集合。添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的集合不存在则返回错误。和列表不同的是:set集合不允许出现重复的元素;
//添加一个或多个元素到集合
sadd s 1 2 3
//获取集合中的所有元素
smembers s
//获取两个集合的交集
sinter s1 s2
//获取两个集合的并集
sunion s1 s2
//获取两个集合的