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、带权重的消息队列 |