Redis
Redis
1、概念
Redis:REmote DIctionary Server(远程字典服务器)。是完全开源免费的,用C语言编写的, 遵守BCD协议。是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。
特点:
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
- Redis支持数据的备份,即master-slave(主从)模式的数据备份
2、Redis优势
- 1、性能极高: Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 2、丰富的数据类型:Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 3、原子: Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 4、**丰富的特性 **: Redis还支持 publish/subscribe, 通知, key 过期等等特性
- 5、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
- 6、使用多路I/O复用模型,非阻塞IO;
3、应用场景
(1) 缓存(数据查询,短连接,新闻内容,商品内容等),使用最多
(2))聊天室在线好友列表
(3)任务队列(秒杀,抢购,12306等)
(4) 应用排行榜
(5)网站访问统计
(6)数据过期处理(可以精确到毫秒)
(7)分布式集群架构中的session问题
4、Redis数据结构
Redis是一种基于内存的数据库,并且提供一定的持久化功能,它是一种键值(key-value)数据库,使用 key 作为索引找到当前缓存的数据,并且返回给程序调用者。
当前的 Redis 支持 6 种数据类型,它们分别是字符串(String)、列表(List)、集合(set)、哈希结构(hash)、有序集合(zset)和基数(HyperLogLog)
5、Redis常用指令
1、String
赋值语法:SET key value【set k1 zhangsan】
取值语法:GET key【get k1】
设置多个键语法:MSET key value [key value …]【mset k2 lisi k3 wangwu】
获得多个键值语法:MGET key [key …]【mget k2 k3】
删除语法:DEL key【del k3】
2、字符串数字的递增与递减
递增:INCR key【incr num】
递减:DECR key【decr num】
增加指定的整数:INCRBY key increment【incrby num2 2】
减少指定的整数:DECRBY key decrement【decrby num2 1】
3、Hash散列
hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。相当于是对象格式的存储
赋值:HSET key field value【hset user1 username zhangsan】
取值:HGET key field【hget user1 username】
设置多个字段:HMSET key field value [field value ...]【hmset user1 password 123 age 20】
取多个值:HMGET key field [field ...]【hmget user1 password age】
获取所有字段值:HGETALL key【hgetall user1】
删除字段:HDEL key field [field ...]【hdel user1 username】
4、队列List
Redis的list是采用来链表来存储,双向链表存储数据,特点:增删快、查询慢(Linkedlist).这个队列是有序的。
向列表左边增加元素: LPUSH key value [value ...]
从列表左边弹出元素: LPOP key(临时存储,弹出后,从队列中清除)
向列表右边增加元素 : RPUSH key value [value ...]
从列表右边弹出元素: RPOP key
获取列表中元素的个数: LLEN key
查看列表语法:LRANGE key start stop
5、Set集合
Set集合类型:无序、不可重复
增加元素语法:SADD key member [member ...]
删除元素语法: SREM key member [member ...]
获得集合中的所有元素 : smembers key
判断元素是否在集合中: SISMEMBER key member
6、Zset有序集合
Sortedset又叫zset,是有序集合,可排序的,但是唯一。 Sortedset和set的不同之处,是会给set中的元素添加一个分数,然后通过这个分数进行排序。
增加元素:ZADD key score member [score member ...]
向有序集合中加入一个元素和该元素的分数(score),如果该元素已经存在则会用新的分数替换原有的分数。
添加带分数(可用学生成绩,销售数量等来做分数,方便计算排序):获得排名在某个范围的元素列表,并按照元素分数降序返回:ZREVRANGE key start stop [WITHSCORES]
获取元素的分数 :ZSCORE key member
删除元素ZREM key member [member ...]
获得元素的分数的可以在命令尾部加上WITHSCORES参数【zrevrange num1 0 4 withscores】
7、HyoperLogLog命令
HyperLogLog是一种使用随机化的算法,以少量内存提供集合中唯一元素数量的近似值。
HyperLogLog 可以接受多个元素作为输入,并给出输入元素的基数估算值:
-
基数:集合中不同元素的数量。比如 {‘apple’, ‘banana’, ‘cherry’, ‘banana’, ‘apple’} 的基数就是 3 。
-
估算值:算法给出的基数并不是精确的,可能会比实际稍微多一些或者稍微少一些,但会控制在合理的范围之内。
HyperLogLog 的优点是,即使输入元素的数量或者体积非常非常大,计算基数所需的空间总是固定的、并且是很小的。
HyperLogLog 相关的一些基本命令:
命令 | 说明 |
---|---|
PFADD key element [element …] | 将指定的元素添加到指定的HyperLogLog 中 |
PFCOUNT key [key …] | 返回给定 HyperLogLog 的基数估算值 |
PFMERGE destkey sourcekey [sourcekey …] | 将多个 HyperLogLog 合并为一个 HyperLogLog |
8、其他命令
keys返回满足给定pattern 的所有key
keys user* //查询以user开头的key
keys * //查询所有的key
exists确认一个key 是否存在,存在返回1
exists key
del删除一个key
del key 删除存在的key返回1,不存在的key返回0
rename重命名key
rename oldkey newkey
type返回值的类型
type key
设置key的生存时间(单位:秒)key在多少秒后会自动删除
EXPIRE key seconds
查看key剩余的生存时间
TTL key
清除生存时间
PERSIST key
获取服务器信息和统计:
info
删除当前选择数据库中的所有key:
flushdb
删除所有数据库中的所有key:
flushall
9、Redis多数据库
一个redis实例key包括多个数据库,客户端可以指定连接某个redis实例的哪个数据库,就好比一个mysql中创建多个数据库,客户端连接时指定连接哪个数据库。
切换数据库
select 1【切换到1号数据库】
将key的值移动到其他数据库
move key 数据库编号【eg:move username 1:把username移动到数据库1】