初识Redis—常用命令操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/William0318/article/details/89115396

Redis能做什么?

Redis是一种缓存型数据库,数据完全存储在内存中,存取速度非常快,qps据说可以达到10w/s。

  • 缓存:将热点数据写到redis中,直接从redis读取,减小后端db压力。
  • 分布式锁与单线程:增量id生成,利用set等操作原子性设置过期时间实现锁操作。
  • 延时队列
  • 计数器:incrby命令,单线程防止并发。
  • 位操作(大数据处理):亿级数据登录判断,签到,去重计算等。
  • 排行榜排序:zset排序。

Redis基础数据结构

1. String

Redis中最简单的数据结构,key=>value存储,如果用户信息数据结构复杂,可以采用json序列化为字符串进行存储,value最大支持512M。

String内部结构实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,当字符串长度小于 1M 时,扩容都是加倍现有的空间; 如果超过 1M,扩容时一次只会多扩 1M 的空间。

> set today Tuesday ex 3600 xx (原子操作)
OK
> get today
"Tuesday"
> ttl today
(integer) 3493
> exists today
(integer) 1
> setnx tomorrow wednsday (不存在时设置)
(integer) 1
> setex tomorrow 3600 bluesky (原子操作)
OK
> psetex tomorrow 3600 bluesky (原子操作,过期时间为毫秒)
OK
> getset today blacksky (设置值返回原先存在的值)
"Tuesday"
> strlen tomorrow
(integer) 8
> append today Tuesday (返回的是长度)
15
> SETRANGE greeting 6 "Redis" (返回的是长度,时间复杂度o(n))
(integer) 11
> getrange today 6 9 (时间复杂度o(n))
"kyTa"
> INCR page_view (对应命令DECR)
(integer) 1
> INCRBY rank 20 (对应命令DECRBY(integer) 20
> INCRBYFLOAT decimal 2.56
2.56
> MSET date "2012.3.30" time "11:00 a.m." weather "sunny"(相关命令mget)
OK
> MSETNX rmdbs "MySQL" nosql "MongoDB" key-value-store "redis" 
(原子操作,要么所有的都设置,要么所有的都不设置,时间复杂度O(n))
(integer) 1

2. hash(字典)

hash相当于Java中的HashMap, 采用的是数组+链表的方式实现,当hash碰撞时,采用维护两套hash结构进行渐进式替换。
hash存储是无序的,值只能是字符串类型,hash 结构的存储消耗要高于单个字符串。

> HSET website google "www.g.cn" 
(integer) 1
> hget website google
"www.g.cn"
> HSETNX database key-value-store Redis
(integer) 1
> HEXISTS phone myphone (判断是否存在)
> HGETALL abbr (获取key下所有的域)
> HDEL phone a (删除域) 算法复杂度o(n)
> HLEN db
> HSTRLEN myhash f1
> HEXISTS counter page_view    # 对空域进行设置
> HINCRBY counter page_view 200
> HINCRBYFLOAT mykey field 0.1
// 以下均为o(n)操作
> HMSET website google www.google.com yahoo www.yahoo.com
> HMGET key field [field …]   
> HKEYS website //返回表所有的列
> HVALS website
> HGETALL key

3. list

Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n),这点让人非常意外。

当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收。

Redis 的列表结构常用来做异步队列使用。将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理。

list数据结构队列的两端都可以进行操作,利用list可以实现先进先出的队列和先进后出的

> LPUSH languages python  (对应RPUSH) //向表头插入元素
> LLEN greet  
> LPUSHX greet "hello"  对应(RPUSHX//key存在时插入元素
> LPOP course  (对应RPOP# 移除头元素
> LREM greet 2 morning     # 移除从表头到表尾,最先发现的两个 morning
> LLEN key
> LINDEX mylist 0 //返回mulist中index为0的元素  o(n)
> LINSERT mylist BEFORE "World" "There"
> LSET list 0 item
> RANGE fp-language 0 0
> LTRIM key start stop  //对列表进行修剪
> BLPOP

4. set

redis的set和Java的hashset一致,set里的值是唯一的,可以用来去重。

> SADD bbs "tianya.cn" "groups.google.com"
> SMEMBERS joe's_movies
> SISMEMBER joe's_movies "bet man"
> SPOP key //移除并返回集合中的一个随机元素
>  SRANDMEMBER fruit 3 //随机返回
>  SREM languages ruby
>  SMOVE songs my_songs "Believe Me" //将 member 元素从 source 集合移动到 destination 集合
>  SCARD key //集合中元素的数量
>  SINTER key
>  SINTERSTORE song_interset songs my_songs
>  SUNION songs my_songs
>  SUNIONSTORE db NoSQL SQL
>  SDIFF peter's_movies joe's_movies
>  SDIFFSTORE joe_diff_peter joe's_movies peter's_movies

5. zset

zset相当于hashmap和set的结合体,zset中的value相当于hash结构,而hash结构中的set是唯一的并且为每个键值赋了一个score。

zset 可以用来存粉丝列表,value 值是粉丝的用户 ID,score 是关注时间。我们可以对粉丝列表按关注时间进行排序。

zset 还可以用来存储学生的成绩,value 值是学生的 ID,score 是他的考试成绩。我们可以对成绩按分数进行排序就可以得到他的名次。

> ZADD key score member [[score member] [score member]] //添加成员
> ZSCORE key member //获取成员的分数
> ZINCRBY key increment member 
> ZCARD key //返回有序集 key 的基数
> ZCOUNT key min max //score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
> ZRANGE salary 1 2 WITHSCORES //分数正序显示区间内的成员
> ZREVRANGE key start stop [WITHSCORES]
> ZRANGEBYSCORE salary -inf 5000 WITHSCORES //显示工资小于5000的成员
> ZREVRANGEBYSCORE
> ZRANK key member //正向排名
> ZREVRANK key member //倒序排名
> ZREM page_rank google.com
> ZREMRANGEBYRANK salary 0 1
> ZREMRANGEBYSCORE key min max
> ZLEXCOUNT key min max  //成员介于 min 和 max 范围内的元素数量
> ZRANGEBYLEX key min max //成员介于 min 和 max 范围内
> ZREMRANGEBYLEX key min max

猜你喜欢

转载自blog.csdn.net/William0318/article/details/89115396
今日推荐