Redis复习

技术Redis复习 Redis复习Redis
Redis基础知识
redis默认有16个数据库
默认使用的是第0个
基本方法
可以使用select进行切换数据库
127.0.0.1:6379 selec

Redis评论

Redis

Redis基础知识

Redis默认有16个数据库。

默认情况下,使用第0个。

基本方法

您可以使用select来切换数据库。

127.0.0.1:6379选择3 #切换数据库。

127.0.0.1:6379[3] DBSIZE

(整数)0

127.0.0.1:6379[3]集名何鹏

127.0.0.1:6379[3] DBSIZE #检查数据库大小。

(整数)1

127.0.0.1:6379[3]获取name #以检查该值。

何鹏

127.0.0.1:6379[3]个键* #查看所有键。

1)“名称”

127.0.0.1:6379[3]选择0

#查看数据库大小。

127.0.0.1:6379 dbsize

(整数)8

按键* #查看所有按键。

127.0.0.1:6379密钥*

1)“观点”

2) 'k13 '

3)“V13”

4)“v11”

5)“名称”

6)“列表”

7)“key 1”

8)“k11”

Flushdb #清空当前库。

127.0.0.1:6379[3] flushdb #清空当前库。

127.0.0.1:6379[3]键*

(空列表或集合)

Flushall #清空所有数据库。

127.0.0.1:6379flushall #清空所有数据库。

为什么redis的端口是6379?

作者是个白痴,有明星名字和粉丝效应。

Reddis是一个单线程。

很快就能理解Redis。官方说Redis是基于内存操作,CPU不是Redis的瓶颈,Redis的瓶颈是基于机器的内存和网络带宽。因为可以通过使用单线程来实现,所以将使用单线程。

Redis是用C语言写的,官方数据是每秒10万QPS,不比Memecache差!

Redis单线程为什么还是那么快?

误解:高性能服务器必须是多线程的。

误解:多线程(CPU上下文会切换)一定比单线程更高效。

Core: redis把所有的数据都放在内存中,所以说单线程操作的效率最高,而多线程(CPU上下文切换消耗),对于内存系统来说,如果没有上下文,操作效率最高,每次读写都在一个CPU上。在内存的情况下,这是最好的解决方案。

五大数据类型

Redis是一个开源(BSD许可),内存中的数据结构存储,用作数据库,缓存和消息代理*。Redis提供数据结构,如字符串、散列、列表、集合、带有范围查询的排序集合、位图、超日志、地理空间索引和流。Redis具有内置的复制、Lua脚本、LRU驱逐、事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供高可用性。

Redis-Key

EXISTS键如果存在则返回1,如果不存在则返回0。

127.0.0.1:6379存在名称

(整数)1

127.0.0.1:6379存在名称1

(整数)0

127.0.0.1:6379

移动键1从当前库中的名称移动到数据库1,1代表数据库。

127.0.0.1:6379移动名称1

(整数)1

127.0.0.1:6379密钥*

1)“年龄”

127.0.0.1:6379选择1

127.0.0.1:6379[1]键

(错误)ERR“键”命令的参数数量错误

127.0.0.1:6379[1]键*

1)“名称”

127.0.0.1:6379[1]

过期密钥

10 设置过期时间,10秒后过期

ttl 键 查看当前key的剩余时间

127.0.0.1:6379[1] keys *
1) "name"
127.0.0.1:6379[1] expire name 10
(integer) 1
127.0.0.1:6379[1] ttl name
(integer) 2
127.0.0.1:6379[1] ttl name
(integer) -2
127.0.0.1:6379[1] get name
(nil)
127.0.0.1:6379[1]

type 键 查看键的类型

127.0.0.1:6379 type name
string
127.0.0.1:6379 type age
string
127.0.0.1:6379

String

字符串类型

append 追加

127.0.0.1:6379 set key1 v1
OK
127.0.0.1:6379 get key1
"v1"
127.0.0.1:6379 append key1 "hello"
(integer) 7
127.0.0.1:6379 get key1
"v1hello"
127.0.0.1:6379

strlen key1 查看key的长度

127.0.0.1:6379 get key1
"v1hello"
127.0.0.1:6379 append key1 ",hepeng"
(integer) 14
127.0.0.1:6379 strlen key1
(integer) 14
127.0.0.1:6379 get key1
"v1hello,hepeng"
127.0.0.1:6379

getrange 截取字符串 range 字符串范围

127.0.0.1:6379 get key1
"helloworld"
127.0.0.1:6379 getrange key1 0 3    #是闭区间的
"hell"
127.0.0.1:6379 getrange key1 0 -1    #获取全部字符串,和get key 是一样的
"helloworld"

SETRANGE 替换

127.0.0.1:6379 set key2 abcdefg
OK
127.0.0.1:6379 get key2
"abcdefg"
127.0.0.1:6379 SETRANGE key2 1 xx    #替换指定位置开始的字符串
(integer) 7
127.0.0.1:6379 get key2
"axxdefg"

setex (set with expire) # 设置过期时间

setnx (set if not exist) # 不存在再设置 在分布式锁中常用

127.0.0.1:6379 setex key3 30 hello     #设置key3的值为hello  30秒后过期
OK
127.0.0.1:6379 ttl key3
(integer) 18
127.0.0.1:6379 ttl key3
(integer) 15
127.0.0.1:6379 get key3
"hello"
127.0.0.1:6379 setnx mykey "redis"   #如果mykey不存在就创建
(integer) 1
127.0.0.1:6379 get mykey
"redis"
127.0.0.1:6379 keys *
 1) "key2"
 2) "views"
 3) "mykey"
 4) "key1"
 5) "list"
 6) "v11"
 7) "k11"
 8) "k13"
 9) "v13"
10) "name"
127.0.0.1:6379 setnx mykey "MongoDB"    #如果存在就不创建
(integer) 0
127.0.0.1:6379 get mykey
"redis"

mset 批量设置值

127.0.0.1:6379 mset k1 v1 k2 v2 k3 v3 k4 v4
OK
127.0.0.1:6379 keys *
1) "k3"
2) "k1"
3) "k4"
4) "k2"

mget 批量获取值

127.0.0.1:6379 mget k1 k2 k3 k4
1) "v1"
2) "v2"
3) "v3"
4) "v4"

msetnx 是原子性操作 要么一起成功要么一起失败

127.0.0.1:6379 msetnx k4 v4 k5 v5
(integer) 0
127.0.0.1:6379 get k5
(nil)

设置user:1对象,用json来保存对象

127.0.0.1:6379 set user:1 {name:zhangsan,age:3}
OK
127.0.0.1:6379 get user:1
"{name:zhangsan,age:3}"
    
这里的key是一个巧妙的设计:user:{id}:{filed}
    
127.0.0.1:6379 mset user:1:name zhangsan user:1:age 23
OK
127.0.0.1:6379 mget user:1:name user:1:age
1) "zhangsan"
2) "23"

getset 先get再set

127.0.0.1:6379 getset db redis    #如果不存在值返回nil
(nil)
127.0.0.1:6379 get db
"redis"
127.0.0.1:6379 getset db mongodb    #如果存在值,获取原来的值,设置新的值
"redis"
127.0.0.1:6379 get db
"mongodb"
    
CAS  比较并交换

数据结构是相同的

List(有序,可重复)

所有的List命令都是以L开头的

lpush 左插入 rpush 右插入

127.0.0.1:6379 Lpush list one    #将一个或多个值插入到列表头部(左)
(integer) 1
127.0.0.1:6379 Lpush list two
(integer) 2
127.0.0.1:6379 lpush list three
(integer) 3
127.0.0.1:6379 lrange list 0 -1    #获取list中的值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379 lrange list 0 1      #通过区间获取具体的值
1) "three"
2) "two"
127.0.0.1:6379 rpush list right      #将一个或多个值插入到列表尾部(右)
(integer) 4
127.0.0.1:6379 lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"

lpop rpop

127.0.0.1:6379 lpop list    #从左移除
"three"
127.0.0.1:6379 rpop list
"right"
127.0.0.1:6379 lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379 lindex list 1   #通过下标获取值
"one"
127.0.0.1:6379 lindex list 0
"two"

lrem 移除list集合中指定个数的value Llen返回列表长度

127.0.0.1:6379 lrange list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379 llen list    #返回列表长度
(integer) 3
127.0.0.1:6379 lrange list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379 lrem list 1 one    #移除list集合中指定个数的value,精确匹配
(integer) 1
127.0.0.1:6379 lrange list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379 lrem list 1 three
(integer) 1
127.0.0.1:6379 lrange list 0 -1
1) "three"
2) "two"
127.0.0.1:6379 lpush list three
(integer) 3
127.0.0.1:6379 lrange list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379 lrem list 2 three
(integer) 2
127.0.0.1:6379 lrange list 0 -1
1) "two"

ltrim

127.0.0.1:6379 rpush mylist "hello"
(integer) 1
127.0.0.1:6379 rpush mylist "world"
(integer) 2
127.0.0.1:6379 rpush mylist "hello1"
(integer) 3
127.0.0.1:6379 rpush mylist "hello12"
(integer) 4
127.0.0.1:6379 rpush mylist "hello3"
(integer) 5
127.0.0.1:6379 lrange mylist 0 -1
1) "hello"
2) "world"
3) "hello1"
4) "hello12"
5) "hello3"
127.0.0.1:6379 ltrim mylist 1 2    #通过下标截取指定长度,这个list已经被改变了,截断了值剩下截取的元素
OK
127.0.0.1:6379 lrange mylist 0 -1
1) "world"
2) "hello1"

rpoplpush #移除列表的最后一个元素,将他移动到另一个新列表中

127.0.0.1:6379 lpush mylist "hello"
(integer) 1
127.0.0.1:6379 lpush mylist "hello1"
(integer) 2
127.0.0.1:6379 lpush mylist "hello2"
(integer) 3
127.0.0.1:6379 lpush mylist "hello3"
(integer) 4
127.0.0.1:6379 lrange mylist 0 -1
1) "hello3"
2) "hello2"
3) "hello1"
4) "hello"
127.0.0.1:6379 rpoplpush mylist list   #查看新列表中,确实存在该值
"hello"
127.0.0.1:6379 lrange list 0 -1
1) "hello"

lset 将列表中指定下标的值替换为另一个值,更新操作

127.0.0.1:6379 exists list      #判断这个列表是否存在,如果不存在列表我们去更新就会报错
1) 0 
127.0.0.1:6379 lrange list 0 -1
1) "hello"
127.0.0.1:6379 lpush list value
(integer) 2
127.0.0.1:6379 lrange list 0 0
1) "value"
127.0.0.1:6379 lset list 0 item   #如果存在就会更新当前下标的值
OK
127.0.0.1:6379 lrange list 0 -1
1) "item"
2) "hello"

linsert 将某个具体的value插入到列中某个元素的前面或者后面

127.0.0.1:6379 lpush list "hello"
(integer) 1
127.0.0.1:6379 lpush list "hello1"
(integer) 2
127.0.0.1:6379 lpush list "hello2"
(integer) 3
127.0.0.1:6379 lrange list 0 -1
1) "hello2"
2) "hello1"
3) "hello"
127.0.0.1:6379 linsert list before "hello2" "other"
(integer) 4
127.0.0.1:6379 lrange list 0 -1
1) "other"
2) "hello2"
3) "hello1"
4) "hello"
127.0.0.1:6379 linsert list after "hello" "java"
(integer) 5
127.0.0.1:6379 lrange list 0 -1
1) "other"
2) "hello2"
3) "hello1"
4) "hello"
5) "java"

总结

Set(无序,不重复)

命令都是以S开头

ladd 添加元素 smembers list 查看集合

127.0.0.1:6379 sadd list "hello"      #set集合中添加元素
(integer) 1
127.0.0.1:6379 sadd list "redis"
(integer) 1
127.0.0.1:6379 sadd list "loveredis"
(integer) 1
127.0.0.1:6379 smembers list
1) "hello"
2) "redis"
3) "loveredis"
127.0.0.1:6379 sismember list "hello"     #判断某一个值是否在集合中,返回1表示存在,0为不存在
(integer) 1
127.0.0.1:6379 sismember list "java"
(integer) 0
127.0.0.1:6379 smembers list
1) "hello"
2) "redis"
3) "loveredis"
127.0.0.1:6379 scard list      #获取当前列表元素个数
(integer) 3
127.0.0.1:6379 sismember list "java"     如果元素存在,则添加不了
(integer) 0
127.0.0.1:6379 srem list "hello"     #移除set集合中的指定元素
(integer) 1
127.0.0.1:6379 smembers list
1) "redis"
2) "loveredis"
127.0.0.1:6379 srandmember list   # 随机获取集合中的元素
"loveredis"
127.0.0.1:6379 srandmember list
"redis"
127.0.0.1:6379 srandmember list 2    #随机获取两个元素
1) "redis"
2) "loveredis"
127.0.0.1:6379 smembers list
1) "c++"
2) "redis"
3) "loveredis"
127.0.0.1:6379 spop list   # 随机移除set集合中的元素
"loveredis"
127.0.0.1:6379 spop list
"c++"
127.0.0.1:6379 smembers list
1) "redis"

将一个指定的值移动到另外一个set集合中

127.0.0.1:6379 smembers myset
1) "hepeng"
2) "hello"
3) "redis"
4) "java"
127.0.0.1:6379 smembers myset2
1) "haha"
127.0.0.1:6379 smove myset myset2 "java"
(integer) 1   

共同关注 (并集)

数字集合类:

差集 SDIFF

并集 SINTER

交集 SUNION

127.0.0.1:6379 smembers key1
1) "b"
2) "a"
3) "c"
127.0.0.1:6379 smembers key2
1) "e"
2) "d"
3) "c"

差集

127.0.0.1:6379 sdiff key1 key2
1) "a"
2) "b"

交集

127.0.0.1:6379 sinter key1 key2
1) "c"

并集

127.0.0.1:6379 sunion key1 key2
1) "e"
2) "c"
3) "b"
4) "a"
5) "d"

共同好友,共同爱好,二度好友,推荐好友!

Hash

Zset

三种特殊的数据类型

geospatial

hyperloglog

bitmaps

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/48879.html

(0)

相关推荐

  • 条条大路通罗马下一句,条条大路通罗马中国版名言

    技术条条大路通罗马下一句,条条大路通罗马中国版名言大道是前人修好的条条大路通罗马下一句,小路需要自己去走,我不喜欢品尝别人的胜利果实,却喜欢独僻蹊径去闯出自己的一条小路。2.独自漫步在小巷,雪白的路灯洒着醒目的光,灰淡的

    生活 2021年10月22日
  • javascript里的style是啥类型(设置里的javascript是什么意思)

    技术JavaScript中style指的是什么意思这篇文章主要介绍了JavaScript中style指的是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解

    攻略 2021年12月22日
  • 管中什么豹,管中窥豹见微知著什么意思

    技术管中什么豹,管中窥豹见微知著什么意思微:隐约;著:明显。 见微知著,意思是见到事情的苗头,就能知道它的实质和发展趋势。 比喻小中见大管中什么豹、以小见大。 出处:汉·班固《白虎通·情性》:“智者,知也。独见前闻,不惑

    生活 2021年10月24日
  • c语言socket编程流程(c语言socket编程怎么实现)

    技术如何使用C语言实现本地socke通讯这篇文章主要介绍了如何使用C语言实现本地socke通讯,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、概述  使

    攻略 2021年12月20日
  • xss漏洞工具xsser怎么用

    技术xss漏洞工具xsser怎么用这期内容当中小编将会给大家带来有关xss漏洞工具xsser怎么用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。今天给大家介绍一款xss漏洞利用工具:x

    攻略 2021年12月9日
  • 指南针s代表什么方向,指南针怎么看,红白针代表什么

    技术指南针s代表什么方向,指南针怎么看,红白针代表什么使用指南针指南针s代表什么方向,可使地图和实际地形的方位一致,探知现在你所在的地点和寻找的目的地的方位。指南针务必水平地拿着,而且要远离以下列举的各种物品,才可避免磁

    生活 2021年10月23日