Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted
set:有序集合)
(一)String(字符串)
- string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
- string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
- string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
实例
1、向已经存在的字符串增加内容
127.0.0.1:6379> append name "hello"
(integer) 16 #返回增加后的长度
2、获取字符创的长度
127.0.0.1:6379> strlen name #获取字符串的长度
(integer) 16
3、字符串的++ --操作
127.0.0.1:6379> set names 0 #设置key值
OK
127.0.0.1:6379> get names #获取key值
"0"
127.0.0.1:6379> incr names #key值++操作
(integer) 1
127.0.0.1:6379> incr names
(integer) 2
127.0.0.1:6379> get names
"2"
127.0.0.1:6379> decr names #key值--操作
(integer) 1
127.0.0.1:6379> decr names
(integer) 0
127.0.0.1:6379> get names
"0"
127.0.0.1:6379>
4、字符串设置步长操作
127.0.0.1:6379> get names #获取当前key值
"10"
127.0.0.1:6379> incrby names 6 #设置步增加6
(integer) 16 #长度为16
127.0.0.1:6379> decrby names 11 #设置步长减少11
(integer) 5 #长度为5
127.0.0.1:6379>
**5、截取字符串的范围**
127.0.0.1:6379> get name
"yuanhaodonghello"
127.0.0.1:6379> getrange name 0 10 #截取字符串 0-10
"yuanhaodong"
127.0.0.1:6379> getrange name 0 -1 #0- -1代表截取字符串总长
"yuanhaodonghello"
127.0.0.1:6379>
6、字符串替换
127.0.0.1:6379> get names
"abcdefg" #之前的字符串内容
127.0.0.1:6379> setrange names 1 xx #进行字符串替换
(integer) 7
127.0.0.1:6379> get names
"axxdefg" #替换后的内容
7、设置key值及过期时间
127.0.0.1:6379> setex name1 30 "hello" #设置key值及过期时间30s
OK
127.0.0.1:6379> ttl name1 #查看Key值剩余时间
(integer) 23
8、key值不存在就创建key,key值存在就更改key值
127.0.0.1:6379> get myname
"redis"
127.0.0.1:6379> setnx myname "mysql" #更改key值
(integer) 0
127.0.0.1:6379>
9、批量取出所有的key
127.0.0.1:6379> keys * #查看所有的key
1) "key1"
2) "names"
3) "myname"
4) "name"
127.0.0.1:6379> mget key1 name names myname #批量取出所以的key
1) "v1hello"
2) "yuanhaodonghello"
3) "axxdefg"
4) "redis"
127.0.0.1:6379>
10、先get在set
127.0.0.1:6379> getset db redis #如果不存在这个值,就返回null
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mysql #如果值已经存在就返回当前值并设置新的值
"redis"
127.0.0.1:6379> get db
"mysql"
127.0.0.1:6379>
(二)List(列表)
- Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
- list命令前面都加上L
实例
2、添加值到list头部
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 0-1的值
1) "tow"
2) "one"
127.0.0.1:6379> lrange list 0 0 #获取list 第一个值
1) "tow"
127.0.0.1:6379> lrange list 0 -1 #获取list中的所有值
1) "tow"
2) "one"
3) "one"
4) "five"
127.0.0.1:6379>
3、添加值到list尾部
127.0.0.1:6379> rpush list five #添加新值到list尾部
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
5) "five"
127.0.0.1:6379>
4、获取list中的指定值
127.0.0.1:6379> lrange list 0 1 #指定范围获取list中的值
1) "three"
2) "two"
127.0.0.1:6379>
5、获取list中的所有值
127.0.0.1:6379> lrange list 0 -1 #获取list中的所有值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379>
6、移除list列表第一个元素
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
5) "five"
127.0.0.1:6379> lpop list #移除list列表第一个元素
"three"
7、移除list列表最后一个元素
127.0.0.1:6379> rpop list #移除list列表最后一个元素
"five"
127.0.0.1:6379>
8、通过下标获取list列表中的某个值
127.0.0.1:6379> lindex list 1
"one"
127.0.0.1:6379>
9、获取list总长度
127.0.0.1:6379> llen list
(integer) 3
127.0.0.1:6379>
10、list中可以存在重复值
127.0.0.1:6379> lpush list one
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "two"
3) "one"
4) "four"
11、移除list中的指定值
127.0.0.1:6379> lrem list 2 one #移除list列表中的两个one
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "four"
127.0.0.1:6379>
12、ltrim截取指定长度
127.0.0.1:6379> lpush list "r1"
(integer) 1
127.0.0.1:6379> lpush list "r2"
(integer) 2
127.0.0.1:6379> lpush list "r3"
(integer) 3
127.0.0.1:6379> ltrim list 1 2 #通过下标截取指定长度
OK
127.0.0.1:6379> lrange list 0 -1 #查看截取后的list列表
1) "r2"
2) "r1"
127.0.0.1:6379>
13、移除列表中的最后一个元素,并将它移动到新的列表中
127.0.0.1:6379> lrange list 0 -1 #查看列表中的所有元素
1) "r2"
2) "r1"
127.0.0.1:6379> rpoplpush list mylist #移除列表中的最后一个元素并移动到新列表
"r1"
127.0.0.1:6379> lrange list 0 -1 #查看原来的列表
1) "r2"
127.0.0.1:6379> lrange mylist 0 -1 #查看新的列表
1) "r1"
127.0.0.1:6379>
14、linsert将某个具体的value插入到某个列表的前面或后面
127.0.0.1:6379> lrange list 0 -1 #查看当前list中的所有值
1) "r2"
127.0.0.1:6379> linsert list before "r2" "r3" #将r3插入到r2前面
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "r3"
2) "r2"
127.0.0.1:6379> linsert list after "r3" "r4" #将r4插入到r3后面
(integer) 3
127.0.0.1:6379> lrange list 0 -1 #再次查看list中的值
1) "r3"
2) "r4"
3) "r2"
127.0.0.1:6379>
(三)Set(集合)
Redis 的 Set 是 string 类型的无序集合,存储的值不能重复!!。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
实例
2、向set中添加元素
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> sadd myset "y1" #向set中添加元素
(integer) 1
127.0.0.1:6379> sadd myset "y2"
(integer) 1
127.0.0.1:6379> sadd myset "y3"
(integer) 1
3、查看set中的所有元素
127.0.0.1:6379> smembers myset #查看set中的所有元素
1) "y3"
2) "y2"
3) "y1"
4、查看set中是否存在指定元素
127.0.0.1:6379> sismember myset y1 #查看set中是否存在指定元素
(integer) 1
127.0.0.1:6379> sismember myset yy
(integer) 0
127.0.0.1:6379>
5、获取set集合中的元素个数
127.0.0.1:6379> scard myset #获取set集合中的元素个数
(integer) 3
127.0.0.1:6379>
6、移除set中的某一元素
127.0.0.1:6379> srem myset y3 #移除set中的y3
(integer) 1
127.0.0.1:6379> smembers myset
1) "y2"
2) "y1"
127.0.0.1:6379>
7、随机删除set中的元素
127.0.0.1:6379> smembers myset #查看set中的所有元素
1) "y2"
2) "y1"
127.0.0.1:6379> spop myset #随机删除set集合中的某个元素
"y2"
127.0.0.1:6379> smembers myset #查看set中的元素
1) "y1"
127.0.0.1:6379>
8、指定元素移动到另一个set集合中
127.0.0.1:6379> smembers myset
1) "y2"
2) "y1"
127.0.0.1:6379> smove myset myset2 "y2" #将myset中的y2移动到myset2中
(integer) 1
127.0.0.1:6379> smembers myset
1) "y1"
127.0.0.1:6379> smembers myset2
1) "y2"
127.0.0.1:6379>
9、set数字集合类(微博,B站的共同关注)差集,并集,交集
127.0.0.1:6379> sadd mylist "a" #向mylist中添加元素
(integer) 1
127.0.0.1:6379> sadd mylist "b"
(integer) 1
127.0.0.1:6379> sadd mylist "c"
(integer) 1
127.0.0.1:6379> sadd mylist2 "c" #向Mylist2中添加元素
(integer) 1
127.0.0.1:6379> sadd mylist2 "d"
(integer) 1
127.0.0.1:6379> sadd mylist2 "e"
(integer) 1
127.0.0.1:6379> sdiff mylist mylist2 #差集
1) "b"
2) "a"
127.0.0.1:6379> sinter mylist mylist2 #交集
1) "c"
127.0.0.1:6379> sunion mylist mylist2 #并集
1) "c"
2) "d"
3) "b"
4) "a"
5) "e"
127.0.0.1:6379>
(四)Hash(哈希)
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
实例
1、设置key value
127.0.0.1:6379> hset myhash name yuanhaodong
(integer) 1
2、通过key获取value
127.0.0.1:6379> hget myhash name
"yuanhaodong"
3、设置多个key value
127.0.0.1:6379> hmset myhash name hello name1 world
OK
4、获取指定的key value
127.0.0.1:6379> hmget myhash name name1
1) "hello"
2) "world"
127.0.0.1:6379>
5、获取所有的key value
127.0.0.1:6379> hgetall myhash
1) "name"
2) "hello"
3) "name1"
4) "world"
127.0.0.1:6379>
6、删除指定的key value
127.0.0.1:6379> hgetall myhash #获取所有的key value
1) "name"
2) "hello"
3) "name1"
4) "hello"
127.0.0.1:6379> hdel myhash name1 #删除指定的key
(integer) 1
127.0.0.1:6379> hgetall myhash #再次查看key value
1) "name"
2) "hello"
127.0.0.1:6379>
7、获取所有的hash表的字段长度
127.0.0.1:6379> hlen myhash
(integer) 2
8、获取hash中指定字段是否存在
127.0.0.1:6379> hexists myhash name
(integer) 1
9、只获取所有的key
127.0.0.1:6379> hkeys myhash
1) "name"
2) "name1"
10、获取所有的value
127.0.0.1:6379> hvals myhash
1) "hello"
2) "zhangsan"
11、hash的 ++ --操作
127.0.0.1:6379> hincrby myhash name 3 #指定增量
(integer) 8
12、hash指定值
127.0.0.1:6379> hsetnx myhash name3 hello #如果值不存在则可以设置
(integer) 1
127.0.0.1:6379> hsetnx myhash name3 world #如果值存在则不可以设置
(integer) 0
(五)zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
实例
1、向zset中添加元素
127.0.0.1:6379> zadd myset 1 one #添加一个元素
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three #添加多个元素
(integer) 2
127.0.0.1:6379> zrange myset 0 -1 #输出元素
1) "one"
2) "two"
3) "three"
127.0.0.1:6379>
2、从小到大排序
127.0.0.1:6379> zrangebyscore salary -inf +inf
1) "yhd"
2) "xiaohong"
3) "zhangsan"
3、根据工资进行排序(从小到大)
127.0.0.1:6379> zadd salary 2500 xiaohong #添加用户
(integer) 1
127.0.0.1:6379> zadd salary 2800 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 500 yuanhaodong
(integer) 1
127.0.0.1:6379> zrangebyscore salary -inf +inf #升序排序
1) "yuanhaodong"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379>
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores
1) "yuanhaodong"
2) "500"
3) "xiaohong"
4) "2500"
5) "zhangsan"
6) "2800"
127.0.0.1:6379>
4、查询工资2500以下的员工升序排序
127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores
1) "yhd"
2) "500"
3) "xiaohong"
4) "2500"
5、移除元素
127.0.0.1:6379> zrange salary 0 -1 #查询所有元素
1) "yhd"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> zrem salary xiaohong #移除元素xiaohong
(integer) 1
127.0.0.1:6379> zrange salary 0 -1 #再次查看移除后的元素
1) "yhd"
2) "zhangsan"
6、获取有序集合中的个数
127.0.0.1:6379> zcard salary
(integer) 2
7、从大到小排序
127.0.0.1:6379> zrevrange salary 0 -1
1) "zhangsan"
2) "yhd"
8、获取指定区间的集合数量
127.0.0.1:6379> zadd myset 1 hello #向集合中添加元素
(integer) 1
127.0.0.1:6379> zadd myset 2 world 3 yuanhaodong
(integer) 2
127.0.0.1:6379> zcount myset 1 2 #获取区间 [1,2]的数量
(integer) 2
Redis事务
- redis事务本质,一组命令的集合,一个事务中所有命令都会被序列化,在事务执行的过程中,会按照顺序执行,一次性,顺序性,排他性,执行一些命令!
- redis事务没有隔离级别的概念,所有命令在事务中,并没有被直接执行,只有发起命令的时候才会被执行!exec
- redis单条命令是保存原子性的,但是事务不保证原子性
事务的执行的三个阶段
- 开始事务
- 命令入队
- .执行事务
实例
1、开启事务
127.0.0.1:6379> multi
OK
2、命令入队
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> get k2
QUEUED
3、开启事务(exec)
127.0.0.1:6379> exec
1) OK
2) OK
3) "v2"
4、放弃事务
127.0.0.1:6379> multi #开启事务
OK
127.0.0.1:6379> set k1 v1 #命令入队
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> discard #放弃最后一个事务
OK
127.0.0.1:6379> get k3
(nil)
5、事务不能正常执行的情况
1)编译型异常
127.0.0.1:6379> multi #开启事务
OK
127.0.0.1:6379(TX)> set k1 v1 #事务入队
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> getset k3 #错误的命令
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379(TX)> set k4 v4
QUEUED
127.0.0.1:6379(TX)> exec #执行事务,事务报错
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k4 #其他的命令都没有被执行
(nil)
127.0.0.1:6379>
2)运行时异常
127.0.0.1:6379> set k1 v1 #设置key value
OK
127.0.0.1:6379> multi #开启事务
OK
127.0.0.1:6379(TX)> incr k1 #k1执行++操作
QUEUED
127.0.0.1:6379(TX)> set k2 v2 #事务入队
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> get k3
QUEUED
127.0.0.1:6379(TX)> exec #执行事务
1) (error) ERR value is not an integer or out of range #第一条命令报错,事务执行
2) OK
3) OK
4) "v3"
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379>