当前位置:网站首页>Redis的使用
Redis的使用
2022-06-26 00:05:00 【枫叶精灵s】
Redis的使用
redis是单线程+多路IO复用,支持多的数据类型
redis默认有16个数据库(0-15)
基本数据类型
Redis键(key)
keys *:查看当前库所有key
exists key:判断key是否存在
type key:判断key的类型
del key:删除key的数据
unlink key:根据value选择非阻塞性删除(仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作)
expire key 10:key10秒钟后过期
ttl key:查看还有多少秒过期,-1永不过期,-2已过期
select:命令切换数据库
dbsize:查看当前数据库的key的数量
flushdb:清空当前库
flushall:通杀全部库
字符串String
String是redis中最基本的数据类型,一个key对于一个value
String是二进制安全的(内容可以用字符串表示,则可以存入内存)。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化对象
一个Redis中字符串value值最多可以是512M
命令
1. set(覆盖原)
set key value
2. get(获取)
get key
3. append(追加)
append key value2
4. strlen(获取值的长度)
strlen key
5. setnx(只在key不存在时设置值)
setnx key value
6. incr(储存的数字值+1)
incr key #如果为空,则为1
7. decr(储存的数字值-1)
decr key #如果为空,则为-1
8. incrby/decrby
incrby/decrby key 步长 #自定义步长
9. mset(同时设置1个或者多个key value)
mset k1 v1 k2 v2 k3 v3
10. mget(获取)
mget k1 k2
11. msetnx
12. getrange(获取固定范围的值)
getrange key 起始位置 结束位置
$ getrange k1 0 1
13. setrange(用value覆写key所存储的字符串值,从 起始位置 开始(索引从0开始))
setrange key 起始位置 value
$ setrange 3 aaa
14. setex(设置键的同时设置过期时间,s)
setex key 过期时间 value
$ setex key 30 value
15. getset(设置新值同时获取旧值)
getset key value
incr/decr原子操作:不会被线程调度机制打断的操作
(1)在单线程中,能够在单条指令中完成的操作都可以认为是“原子操作”。因为中断发生在指令之间
(2)在多线程中,不能被其他线程调度操作叫原子操作。
数据结构
String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配
列表List
单键多值
Redis列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际是一个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会比较差
命令
1. lpush/rpush(从左/右插入一个或多个值)
lpush k1 l1 lin1 ling1 #头插法
rpush k2 l2 lin2 ling2 #尾插
2. lpop/rpop(取出)(值光键亡)
lpop k1
rpop k2
3. rpoplpush(从右取值插入左)
rpoplpush k1 k2
4. lrange(按下标获取元素 左到右)
lrange key start stop
$ lrange k1 0 -1 #去所有的值 0左边第一个 -1右边第一个
5. lindex(按索引下标获取元素)
lindex key value
$ lindex k1 1
6. llen(获取长度)
llen key
7. linsert(插入)
linsert key befor value newvalue #在value后面插入newvalue
$ linsert k1 before lin1 lin01
# after
8. lrem(从左边删除多个value)
lrem key n value
$ lrem k1 2 lin01
9. lset(替换)
lset key index value #将key下标为index替换为value
数据结构
List的数据结构为快速链表quickList
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也是压缩列表
它将所有的元素紧挨在一起存储,分配的是一块连续的内存
当数据量比较多时才会改成quicklist
因为普通的链表需要的附加空间太大,会比较浪费空间。
Redis将链表和ziplist结合起来组成quicklist,也就是将多个ziplist使用双向指针串起来使用,这样既满足了快速的插入删除,又不会出现太大的空间冗余
集合Set
Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要储存一个列表类型,又不希望出现重复的数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要借口,这个也是list所不能提供的。
Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加、删除、查找的时间复杂度都是O(1)。
一个算法,随着数据的增加,执行时间的长短,如果是O(1),数据增加,查找数据的时间不变。
命令
1. sadd(添加)
#将一个或多个member元素添加到集合key中,已经存在的member元素将自动忽略
sadd key value1 value2 value3
$ sadd k1 v1 v2 v3
$ sadd k1 v1 v4 v5
2. smembers(取出集合中的全部元素)
smembers key
$ smembers k1
3. sismember(判断key是否含有value)
sismember key value
$ sismember k1 v1
4. scard(返回集合元素个数)
$ scard k1
5. srem(删除元素)
$ srem k1 v1
6. spop(随机取出数,值从集合中删除)
$ spop k1 2
7. srandmember(随机从集合中取出n个值,不会从集合中删除)
$ srandmember k1 2
8. smove(将值移到另一个集合)
smove source destination value
$ smove k1 k2 v4
9. sinter(交集)
$ sinter k1 k2
10. sunion(并集)
$ sunion k1 k2
11. sdiff(差集)
$ sdiff k1 k2
数据结构
Set数据结构是dict字典,字典是用哈希表实现的。
Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向通一个内部值。
哈希Hash
Redis hash是一个键值对集合
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
类似Java里面的Map<String ,Object>
用户ID为查找的key,存储的value用户对象包括姓名、年龄等信息,如果用普通的key/value结构来存储
命令
1. hset(给key集合中的field键赋值)
hset key field value #返回字段数
$ hset u1 name lin01 age 18
$ hset u2 name lin02 age 19
2. hget(取出value)
hget key field
$ hget u1 name
3. hmset(批量设置value)
hmset key field1 value1 field2 value2 #没有返回值
$ hmset u3 name lin03 age 20
4. hexists(key中field是否存在)
hexists key field
$ hexists u1 name
5. keys(列出key中所有的field)
hkeys key
$ hkeys u1
6. hvals(列出所有的value)
hvals key
$ hvals u1
7. hincrby(value增量)
hincrby key field increment
$ hincrby u1 age 2
8. hsetnx(将可以中的field的值设置为value,当且仅当field不存在)
hsetnx key field value
$ hsetnx u1 sex 女
数据结构
Hash类型对应的数据结构是两种:ziplist(压缩列表)、hashtable(哈希表)。当field-value长度较短且个数少时,使用ziplist,否则使用hashtable
Zset(有序集合)
Redis有序集合zset与普通集合set相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从低分到高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以重复了。
因为元素是有序的,所有你也可以很快的根据评分(score)或次序(position)来获取一个范围的元素。
访问有序集合的中间元素也非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表
命令
1. zadd(加入)
zadd <key1> <score1> <value1> <score2> <value2> #将一个或多个member元素及其score值加入到有序集key当中
$ zadd user 1 lin01 2 lin02 3 lin03
2. zrange(返回值)
zrange <key> <start> <stop> [WITHSCORES] #返回下标start stop之间的元素
$ zrange user 0 -1
3. zrangebyscore
zrangebuscore key min max [withscores][limit offset count] #返回有序集key中,所有score值介于min max、之间(包括)的成员。有序集按照score从小到大排序
$ zrangebyscore user 2 3 withscores
4. zrevrangebyscore
zrangebuscore key max min [withscores][limit offset count] #返回有序集key中,所有score值介于min max、之间(包括)的成员。有序集按照score从大到小排序
$ zrevrangebyscore user 3 1
5. zincrby
zincrby <key> <increment> <value> #为元素score加上增量
$ zincrby user 5 lin01
6. zrem
zrem key value #删除该集合下指定值的元素
$ zrem user lin01
7. zcount
zcount key min max #统计该集合,在分数区间内的元素个数
$ zcount user 2 3
8. zrank
zrank key value #返回该值在集合中的排名,从0开始
$ zrank user lin03
数据结构
SortedSet(zset)是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map<String,Double>,可以给每一个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。
zset底层使用了两个数据结构
- hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。
- 跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表
边栏推荐
猜你喜欢

24. histogram calculation

Textcnn paper Interpretation -- revolutionary neural networks for sense classification

Can bus transceiver principle

Simple making of master seal

Xiaomi tablet 5 Pro unlock bootloader

Abnova丨ACTN4 DNA 探针解决方案

Interpretation of script corresponding to postman assertion

甜酷少女金书伊 受邀担任第六季完美童模全球总决赛代言人

Make a row of the dataframe a column name

Talking about interface test (2)
随机推荐
APP测试(一)
MySQL例题一 综合案例(多条件组合查询)
2022 explosion proof electrical operation certificate examination question bank and simulation examination
Pixel6 unlock bootloader
web测试
tos cos dscp 区别和作用
MySQL example - comprehensive case (multi condition combined query)
Summary of in-depth learning optimization techniques
Summary of informer's paper
leetcode 300. Longest increasing subsequence (medium)
21. Hoff circle transformation
**MySQL example 1 (query by multiple conditions according to different problems)**
Android system startup security
Xiaomi tablet 5 Pro unlock bootloader
JQ获取对象的几种方式
PTA class a simulated seventh bomb: 1160-1163
Fasttext knowledge points summary
弹性蛋白酶的用途和化学性质
Abnova丨CMV CISH 探头解决方案
GUN make (1) 简介