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)
Redis的6种数据结构

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】