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