01-redis基础认知

redis的配置

Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf(Windows 名为 redis.windows.conf)。

你可以通过 CONFIG 命令查看或设置配置项。

redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME
# 使用*获取所有配置
CONFIG GET *

使用CONFIG SET来修改配置

redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE

具体的参数含义可以查阅其他网站

redis概述

  • 默认16个库,默认使用0号库

  • select命令来选择库,如选中8号库:select 8

  • 所有库同一密码

  • 几个常用命令

    dbsize 		# 查看当前库的容量
    flushdb 	# 清空当前库
    flushall 	# 清空所有库
    
  • 单线程+多路I/O复用

  • 数据在内存中,支持持久化操作

  • redis的操作是原子操作,因为redis是单线程的,不会有上下文切换来打断

redis数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

针对key的操作

keys * 				# 查看所有key
exists key 			# 查看某key是否存在
type key 			# 查看某key数据类型
del key 			# 删除指定key
unlink key 			# 非阻塞删除
expire key [time] 	# 设置失效时间
ttl key 			# 查看失效时间,-1永不失效,-2已失效

String

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。最大512mb。

append key value 	# 追加值
strlen key 			# 获取长度
setnx key value 	# 新建key,不能用于覆盖,key不存在时才能使用
incr key 			# 数字值+1
decr key 			# 数字值-1
incrby/decrby key value # 增加或减少value这么多的值
mset/msetnx key1 value1 key2 value2 ... # 一次性设置多个值
mget key1 key2 key3 ... # 一次性取多个值
getrange key start end # 取范围内的字符串,下标从0开始
setrange key start value # 从某个位置开始设置一个字串
setex key [time] value # 设置键的时候同时设置过期时间
getset key1 key2 # 用key1体代key2的值

数据结构

String的底层和java中的ArrayList一样,冗余分配,动态扩容

Hash

  • 类似于java中的Map<String,Object>

hash是一个键值对集合,一个映射表。每个 hash 可以存储 232 -1 键值对(40多亿)。

命令如下:

hset k f v # 对键k的字段f赋值为v
hget k f # 从键k的字段f得到值
hmset k f1 v1 f2 v2 ... # 设置多个字段值
hexists k f # 查看是否存在某个字段
hkeys k # 列出k的所有字段
hvals k # 列出k的所有值
hincrby k f increment # 键k的f字段增加increment值
hsetnx k f v # 设置字段f的值为v,仅用于初始化

数据结构

数量少时采用zipList,否则使用hashTable

List

  • 底层是双向链表,双端操作性能高,索引操作中间性能低
  • 索引-1标表示最后一个

List是简单的String列表,按照插入顺序排序。

可以插入头部也可以插入尾部。

lpush/rpush # 从左边或右边放入值
lpop/rpop key # 从左边或者右边吐出值赋给key,值吐完后键也失效
rpoplpush key1 key2 # 从key1右边取出值放key2的左边
lrange start end # 从start取到end
lindex key index # 通过下标取值
llen key # 获取列表长度  
linsert k1 before/after v1 value # 在值v1的之前或之后插入新值
lrem k n v # 删除前n个值为v的部分
lset k index v # 设置下标index的值为v

数据结构

底层为quickList快速链表

列表元素很少时为zipList压缩链表,空间连续

数据量多时,多个zipList连起来组成quickList

Set

Redis 的 Set 是 string 类型的无序集合。与List类似,但没有重复元素

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

sadd k v1,v2,v3... # 添加一个或多个元素
smembers k # 取出键k的所有值
sismember k v # 判断集合中是否有v这个值
srem k v1,v2... # 删除一个或多个值
spop k # 随机吐出一个值
srandmember k v # 随机得到n个值,不会从k中删掉
smove k1 k2 v # 把k1的v值移到k2
sinter/sunion/sdiff k1 k2 # 取k1和k2的交集和并集以及差集

数据结构

底层是一个hash表

增删查改复杂度都是O(1)

Zset

每个元素都会关联一个double类型的分数(score)。redis正是通过分数来为集合中的成员进行从小到大(默认)的排序。

  • 值都是唯一的,但每个值关联的score可以是重复的
zadd k score1 v1 score2 v2 ...# 添加多个值,并关联评分
zrange k start stop [WITHSCORES] # 返回下标start到stop的值,可以使用WITHSCORES带着积分一起返回
zrangebyscore k score1 score2 # 返回积分score1到score2之间的值
zrevrangebyscore k score1 score2 # 同上,但返回顺序是从大到小
zincrby k n v # 为n的积分加上n值
zrem k v # 删除v
zcount k min max # 统计积分在min到max之间的值有几个
zrank k v # 返回v在k中的排名

数据结构

hash:通过hash来对应值和积分

跳跃表:通过score给value排序

跳跃表

链表模仿二分查找的一种方式,比如下图

L1查找55要8次,L2查找只要4次,L1查找只要两次

总结

类型 简介 特性 场景
String(字符串) 二进制安全 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M ---
Hash(字典) 键值对集合,即编程语言中的Map类型 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) 存储、读取、修改用户属性
List(列表) 链表(双向链表) 增删快,提供了操作某一段元素的API 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列
Set(集合) 哈希表实现,元素不重复 1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐
Sorted Set(有序集合) 将Set中的元素增加一个权重参数score,元素按score有序排列 数据插入集合时,已经进行天然排序 1、排行榜 2、带权重的消息队列
posted @ 2021-09-23 21:34  XXXTaye  阅读(35)  评论(0编辑  收藏  举报