Redis系列---基础学习(Redis基础概念、基础命令、数据类型讲解)
今天主要是学习Redis的第一步,掌握Redis的基础概念包含基础指令,其次,我们需要掌握其全部数据类型,感兴趣的可以关注,后续会分类更新全部java的白话文教学内容;
接下来我们带着下面三个问题来学习今天的内容:
1、它是什么?
2、为什么要用它?
3、如何使用?
一、Redis是什么?
Redis:Remote Dictionary Server,即远程字典服务
是完全开源免费,用C语言编写的,是一个基于内存运行、支持持久化、高性能的(Key/Value)分布式内存数据库,也是当前最热门的NoSQL数据库之一,也被人们称为数据结构服务器。
Redis与其他key-value缓存产品有以下三个优势:
- Redis支持数据持久化,可将内存中的数据持久化至磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的 key-value 类型数据,同时还提供list、set、zset、hash等数据结构的存储。
- Redis支持数据备份,即master-slave模式的数据备份。
(白话文: 说白了,Redis就是一种拥有存储数据的功能,比关系型数据库更加灵活、自由,通常情况用于进行缓存、分布式锁、计数器、消息队列等操作,而其中最主要的使用是:缓存,存储些临时的、频繁访问的数据,减少对后端数据库的访问,从而提高系统的响应速度和性能)
二、为什么要使用Redis?
1. 使用的企业和人多,如果没人使用,我们也就不会使用它
2. 支持内存存储和持久化
Redis支持异步将内存中的数据写到硬盘上,同时不影响服务的正常运行。因为Redis交换数据快,所以在服务器中常用来存储一些临时的、需要频繁调取的数据,这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,极大提升响应速度;
三、如何使用Redis?
3.1、Redis常识与基础命令
默认16个数据库,类似数组下标从0开始,初始默认使用1号库(索引为0)
基础命令如下:
select * 切换数据库
dbsize 查看当前库的key的数量
set key vale 数据库存储值
get key 获取值
exists key 判断是否存在该key值,存在该key值则返回1,不存在返回0
keys * 查看数据库所有的key
flushdb 清空当前数据库
flushall 清空所有数据库
expire key xxx 设置key值xxx秒过期
ttl key 查看该key值剩余多少秒过期
persist key 取消过期
type key 查看当前key的类型
面试题分享:Redis为什么是单线程的?
我看很多人都是这样回答的:
因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就 顺理成章地采用单线程的策略了。
其实也没错,但是不够细,面试还是需要比较细致的回答面试官问题的,所以我总结如下:
1. 多线程线程切换是需要时间成本的
2. 单线程避免了并发访问线程安全问题(锁竞争)
3. 单线程天然地保证了操作的原子性(Redis很多指令都是需要原子性操作)
3.2、数据类型
3.2.1、5大基础数据类型
String、List、Hash、Set、Zset
接下来我们就一个个的过:
1、String类型
使用场景: 常规key-value缓存应用、 常规计数器功能:微博数,粉丝数、访问量等
我们在工作中,估计80%都在使用String类型,而且很多人估计使用redis只会使用String
基本指令:
set key value 设置值
get key 获取值
del key 删除key
strlen key 获取该key值对应的value值的长度
append key "xxx" 在该key对应的value值追加上xxx
incr key 该key对应的value自增1
decr key 该key对应的value自减1
incrby key xx 设置自增步长,该key对应的value增加xx
decrby key xx 设置自减步长,该key对应的value减少xx
getrange key x1 x2: 获取x1-x2范围内的值,类似between..and的关系,从零到负一表示全部
注意: String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字
2、List类型
使用场景: 栈、队列,如:浏览器历史记录、撤销操作等需要后进先出(LIFO)等
基本指令:
所有的list命令都是用l开头的
lpush 集合名 value 将xx插入到集合头部
rpush 集合名 value 将xx插入到集合尾部
lrange 集合名 x y 获取集合里x-y(x、y代表下标)的值(0 -1为获取集合中所有的值)
lpop 集合名 移除该集合的左值
rpop 集合名 移除该集合的右值
lindex 集合名 x 获取该集合中下标为x的值
llen 集合名 获取集合的长度
lset 集合名 index xx 将集合下标为index的值更新为xx(不能添加)
linsert 集合名 before yy xx 在集合中的yy值前面插入一个xx值
linsert 集合名 after yy xx 在集合中的yy值后插入一个xx值
注意: List数据结构左右都可以插入数据、获取数据
3、Hash类型
使用场景: 对象的缓存等
基本指令:
hset key field value 设置值
hget key field 获取值
hdel key field [field …] 删除field
hlen key 计算field个数
hgetall field [field …] 获取所有的field-value
hmget field [field …] 批量获取field-value
hexists key field 判断field是否存在
hkeys key 获取所有的field
hvals key 获取所有的value
hsetnx key field value 设置field值,field不存在时成功
hincrby key field n 对应field-value+n
hincrbyfloat key field n 对应field-value+n(浮点数版)
hstrlen key field 计算value的字符串长度
注意: List数据结构左右都可以插入数据、获取数据
4、Set类型
使用场景: 文章点赞、共同关注等
基本指令:
sadd key element [element … ] 向set添加一个获多个元素
smembers key 获取集合的所有元素
sismember key element 判断一个元素是否在set中
scard key 求集合中元素个数
spop key [count] 随机删除并获取元素
srandmember key [count] 随机获取元素
smove sourse destination member 将元素从一个集合中移到另一个集合
srem key member [member …] 移除指定元素
sinter key1 [key2 … ] 求交集
sinterstore destination key1 [key2 …] 求交集并放入指定集合中
sunion key1 [key2 … ] 求并集
sunionstore destination key1 [key2 …] 求并集并放入指定集合中
sdiff key1 [key2 … ] 求差集
sdffstore destination key1 [key2 …] 求差集并放入指定集合中
5、ZSet类型
使用场景: 排行榜、电话、姓名排序等
基本指令:
zadd 集合名 scroe值 value 向集合中增加value值,排序的时候通过score的值进行排序
zrange 集合名 0 -1 查询集合中所有的值,默认按照score值的升序排列
zrangebyscore 集合名 -inf +inf 按score值升序排列,可以用具体值替换+-inf,例如[-inf,2000]
zrevrangebyscore 集合名 +inf -inf 按照score的值降序排列
zrem 集合名 value 移除该集合中的指定元素
zcard 集合名 获取有序集合中的元素的个数
3.2.2、3种特殊数据类型
1、geospatial类型
使用场景: 朋友定位、附近的人、打车距离、两点之间的距离、以某一个点为中心,距离中心多少的人或者事物等
基本指令:
geoadd key 经度1 纬度1 城市1 在key中存储城市的位置信息
如:geoadd china:city 116.40 39.90 beijin
geopos key 城市1 取出key中指定城市的的经度和纬度
geodist key 城市1 城市2 m/km 计算两个城市之间的距离,单位为m/km
georadius key 经度 纬度 500km key下所有距离该位置半径为500km的范围内的城市
georadiusbymember key 城市1 1000km 找出key下距离城市1000km范围内的城市
2、hyperloglog类型
HyperLogLog是一种概率数据结构,用于基数估计,即估计一个集合中不同元素的数量。它非常适合用来统计独立元素的数量,比如在网页访问量统计、独立用户计数等场景中。HyperLogLog的优势在于其内存效率极高,即使在数据量极大的情况下,也能保持极低的内存(占用内存固定:12kb)占用,且错误率控制在0.81%。
所谓的 基数: 集合中不重复的元素的个数 。
使用场景: 网站的访问量、广告点击率分析、游戏玩家分析、社交媒体分析等
基本指令:
[PFADD key element [element ...] 添加指定元素到 HyperLogLog 中。
[PFCOUNT key [key ...] 返回给定 HyperLogLog 的基数估算值。
[PFMERGE destkey sourcekey [sourcekey ...] 将多个 HyperLogLog 合并为一个 HyperLogLog,并集计算
3、bitmaps类型
位图(Bitmaps)是一种非常有用的数据结构,它允许存储大量的二进制数据(即只有0和1的位)。Redis的位图操作非常高效,特别是在处理大量布尔值或者计数问题时非常有用。
使用场景: 用户活跃性跟踪、统计独立访客、用户登录状态记录、计数器(例如访问次数)等
基本指令:
zadd 集合名 scroe值 value 向集合中增加value值,排序的时候通过score的值进行排序
zrange 集合名 0 -1 查询集合中所有的值,默认按照score值的升序排列
zrangebyscore 集合名 -inf +inf 按score值升序排列,可以用具体值替换+-inf,例如[-inf,2000]
zrevrangebyscore 集合名 +inf -inf 按照score的值降序排列
zrem 集合名 value 移除该集合中的指定元素
zcard 集合名 获取有序集合中的元素的个数
本篇完结(下一篇,Redis高频面试问题总结,有需要的朋友可以关注我,后续持续分享Java更多白话文讲解)