Redis— —概念介绍

概述

全称:REmote DIctionary Server(远程字典服务器)是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(Key/Value)分布式内存数据库
基于内存运行,并支持持久化的NoSQL数据库,是当前最热门的NoSQL数据库之一,也被人们称为数据结构服务器。
 


特点

  1. Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
  2. Redis不仅仅支持简单的 key-value 类型的数据,同时还提供list、set、zset、hash等数据结构的存储。
  3. Redis支持数据的备份,即master-slave模式的数据备份。 

原理

redis是单线程的

Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。

 redis是内存存储和持久化的

redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务。众多语言都支持Redis,因为Redis交换数据快,所以在服务器中常用来存储一些需要频繁调取的数据,这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,更重要的是可以极大提升速度。 


使用

‎Redis是一个非常快速‎‎的非关系数据库‎‎解决方案。其简单的键值数据模型使 Redis 能够处理大型数据集,同时保持令人印象深刻的读写速度和可用性。‎

Redis一共有5种数据类型和三种特殊类型

string(字符串),hash(哈希),list(列表),set(集合),zset(sorted set:有序集合)。

Hyperloglog、Geo、Streams。

1、string(字符串)

string 类型是 Redis 最基本的数据类型,一个 key 对应一个 value。
它是一个由字节组成的序列,string 类型的值最大能存储 512MB。

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。如JPEG图像数据和Json对象说明信息。它是标准的key-value,通常用于存储字符串、整数和浮点。

String可以存储三种类型,INT(整数)、float(单精度浮点数)、string(字符串)。

‎由于所有数据都在单个对象中,Redis 中的字符串操作速度非常快。

‎基本的‎‎ Redis 命令(如 SET、‎‎GET‎‎ 和 ‎‎DEL‎‎)允许您对字符串值执行基本操作。‎

  • ‎SET 键值‎‎ ‎‎– 设置指定键的值。‎
  • ‎GET 键‎‎ ‎‎– 检索指定键的值。‎
  • ‎DEL 键‎‎ ‎‎– 删除给定键的值。‎

操作命令 

# 存值(如果对同一个key set多次会直接覆盖旧值)
set jack 2673
# 取值
get jack
# 查看所有键
keys *
# 获取键总数(生产环境数据量大,慎用)
dbsize
# 查看键是否存在
exists jack
# 删除键
del jack tonny
# 重命名键
rename jack tonny
# 查看类型
type jack 
# 获取指定范围的字符
getrange jack 0 1
# 获取值长度
strlen jack
# 字符串追加内容
append jack good
# 设置多个值(批量操作,原子性)
mset jack 2673 tonny 2674
# 获取多个值
mget jack tonny
# 设置值,如果key存在,则不成功
setnx jack shuaige
# 基于此实现分布式锁
set key value [expiration EX seconds|PX milliseconds][NX|XX]
# (整数)值递增(值不存在会得到1)
incr jack
incrby jack 100
# (整数)值递减
decr jack
decrby jack 100
# 浮点数增量
set mf 2.6
incrbyfloat mf 7.3

2、hash(哈希)

Redis hash 是一个键值(key=>value)对集合。

Hash用来存储多个无序的键值对,最大存储数量2^32-1(40亿左右)。

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。Redis的Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。和String略像,但value中存放的是一张表,一般用于多个个体的详细事项排列,String也可以做到,但要比hash麻烦许多。

哈希命令允许您独立访问和更改单个或多个字段。‎

  • ‎HSET‎‎ – 将值映射到哈希中的键。‎
  • ‎HGET‎‎ – 检索与哈希中的键关联的各个值。‎
  • ‎HGETALL‎‎ ‎‎– 显示整个哈希内容。‎
  • ‎HDEL‎‎ – 从哈希中删除现有的键值对。‎

 操作命令 

# 设置、批量设置值
hset h1 f 6
hset h1 e 5
hmset h1 a 1 b 2 c 3 d 4
# 取值
hget h1 a
# 批量取值
hmget h1 a b c d
# 获取所有field
hkeys h1
# 获取所有field的值
hvals h1
# 返回哈希表中,所有的字段和值
hgetall h1
# 删除field
hdel h1 a
# 获取哈希表中字段的数量
hlen h1

3、list(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。

存储有序的字符串(从左到右),元素可以重复,最大存储数量2^32-1(40亿左右)。

你可以添加一个元素到列表的头部(左边)或者尾部(右边)。Redis的列表允许用户从序列的两端推入或者弹出元素,列表由多个字符串值组成的有序可重复的序列,是链表结构,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着,即使有数以千万计的元素列表,也可以极快地获得10条记录在头部或尾部。可列入名单的要素最多只有4294967295个。

此‎‎字符串链表‎‎允许您执行一组操作,例如:‎

  • ‎LPUSH‎‎ – 将值推送到列表的左端。‎
  • ‎RPUSH‎‎ – 将值推送到列表的尾端。‎
  • ‎LRANGE‎‎ – 检索一系列项目。‎
  • ‎LPOP/RPOP‎‎ ‎‎– 用于显示和删除两端的项目。‎
  • ‎LINDEX‎‎ ‎‎– 从列表中的特定位置获取值。‎

操作命令  

# 左推
lpush queue a
lpush queue b c
# 右推
rpush queue d e
# 左边移除并返回列表的第一个元素
lpop queue
# 右边移除并返回列表的第一个元素
rpop queue
# 通过索引获取列表中的元素
lindex queue 0
# 返回列表中指定区间内的元素
lrange queue 0 -1

4、set(集合) 

Redis 的 Set 是 string 类型的无序集合。最大存储数量 2^32-1(40亿左右)。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。所谓集合就是一堆不重复值的组合,并且是没有顺序的。在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还提供了诸如collection、union和differences等操作,使得实现诸如commandism、poperhike、secondfriends这样的功能变得很容易,或者选择是将结果返回给客户机,还是将它们保存到使用不同命令的新的集合中。

使用‎‎以下命令‎‎添加、删除、检索和检查集合中的各个项目:‎

  • ‎SADD‎‎ – 向集合中添加一个或多个项目。‎
  • SISMEMBER‎ – 找出一个项目是否是集合的一部分。‎
  • ‎SMEMBERS‎‎ – 从集合中检索所有项目。‎
  • ‎SREM‎‎ – 从集合中删除现有项。‎

 操作命令 

# 左推
lpush queue a
lpush queue b c
# 右推
rpush queue d e
# 左边移除并返回列表的第一个元素
lpop queue
# 右边移除并返回列表的第一个元素
rpop queue
# 通过索引获取列表中的元素
lindex queue 0
# 返回列表中指定区间内的元素
lrange queue 0 -1

5、sorted set (有序集合)

sorted set也叫Redis zset ,和set 一样也是string类型元素的集合,存储有序的元素,每个元素都有个 score,按照 score 从小到大排序。score 相同时,按照 key 的ASCII码排序。

不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

您可以按成员、排序顺序和分数值访问排序集中的项目。基本命令允许您根据成员值和分数范围提取、添加、删除单个值或检索项目。‎

  • ‎ZADD‎‎ ‎‎– 将具有分数的成员添加到排序集。‎
  • ‎ZRANGE‎‎ ‎‎– 根据项目在排序顺序中的位置检索项目。‎‎withscores‎‎ ‎‎选项生成实际分数值。‎
  • ‎ZRANGEBYSCORE ‎‎– 根据定义的分数范围从排序集中提取项目。‎‎withscores‎‎ ‎‎选项生成实际分数值。‎
  • ‎ZREM‎‎ –‎‎从已排序的集中删除项目。‎

 操作命令 

# 添加元素
zadd myzset 10 java 20 php 30 ruby 40 cpp 50 python
# 获取全部元素
zrange myset 0 -1 withscores
zrevrange myzset 0 -1 withscores
# 根据分数区间获取元素
zrangebyscore myzset 20 30
# 移除元素(也可以根据score rank删除)
zrem myzset php cpp
# 统计元素个数
zcard myzset
# 分值增加
zincrby myzset 5 python
# 根据分值min和max统计个数
zcount myzset 20 60
# 获取python排名
zrank myzset python
# 获取元素分数
zscore myzset python

-BitMaps

BitMaps是在字符串类型上定义地位操作,一个字节由8个二进制位组成。 

 操作命令

# 设置字符串key为k1,value为mic
set k1 mic
# 取k1的第七位,结果是0
getbit k1 6
# 取k1的第八位为0,此时的ASCII码是108,对应字母是l
setbit k1 7 0
# 所以取出来值为lic
get k1
# 统计二进制中1的个数,一共是12个
bitcount k1
# 获取第一个1或者0的位置
bitpos k1 1
bitpos k1 1

6、Hyperloglog 

Hyperloglog 提供了一种不太精确的基数统计方法,用来统计一个集合中不重复的元素个数,比如统计网站的UV,或者应用的日活、月活,存在一定的误差。

在 Redis 中实现的 Hyperloglog,只需要12k内存就能统计2^64个数据。

 操作

    public static void main(String[] args) {
        Jedis jedis = new Jedis("39.103.144.86", 6379);
        float size = 100000;
        for (int i = 0; i < size; i++) {
            jedis.pfadd("hll", "hll-" + i);
        }
        long total = jedis.pfcount("hll");
        System.out.println(String.format("统计个数: %s", total));
        System.out.println(String.format("正确率: %s", (total / size)));
        System.out.println(String.format("误差率: %s", 1 - (total / size)));
        jedis.close();
    }

7、Geo

现在有这样一个需求,获取半径1公里以内的门店,那么我们就要把门店的经纬度存起来,如果存在数据库的话,一个字段存经度,一个字段存维度,计算距离比较复杂。现在我们通过 Redis 的 Geo 存储十分方便。 

操作 

# 存经纬度
geoadd location 121.445	31.213 shanghai
# 取经纬度
geopos location shanghai
    public static void main(String[] args) {
        Jedis jedis = new Jedis("39.103.144.86", 6379);
        Map<String, GeoCoordinate> geoMap = new HashMap<>();
        GeoCoordinate coordinate = new GeoCoordinate(121.445, 31.213);
        geoMap.put("shanghai", coordinate);
        jedis.geoadd("positions", geoMap);
        System.out.println(jedis.geopos("positions", "shanghai"));
        jedis.close();
    }

8、Streams 

5.0推出的数据类型。支持多播的可持久化的消息队列,用于实现发布订阅功能,借鉴了Kafka的设计。 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值