启动Redis服务
通过指定的配置文件启动服务
redis-server kconfig/redis.conf
通过Redis客户端进行连接
redis-cli -p 6379
简单测试
查看redis的进程是否开启
ps -ef|grep redis
关闭服务
shutdown
再次查看进程 关闭成功
数据类型
String字符串
127.0.0.1:6379> flushdb //清空
OK
127.0.0.1:6379> keys * //查看所有
(empty array)
127.0.0.1:6379> set key1 v1 //设置
OK
127.0.0.1:6379> get key1 //获取
"v1"
127.0.0.1:6379> keys * //查看所有
1) "key1"
127.0.0.1:6379> exists key1 //判断某一个键是否存在
(integer) 1
127.0.0.1:6379> exists key2 //不存在返回0
(integer) 0
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 //求长度
(integer) 7
127.0.0.1:6379> append key2 "zhangsan" //追加字符串,如果键不存在,相当于 set key
(integer) 8
127.0.0.1:6379> get key2 //获取
"zhangsan"
127.0.0.1:6379>
自增 自减
incr decr
127.0.0.1:6379> set views 0 //设置浏览量为0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views //自增1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views //自减1
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> decr views
(integer) -1
127.0.0.1:6379> get views
"-1"
127.0.0.1:6379> incrby views 10 //自增10
(integer) 9
127.0.0.1:6379> incrby views 10
(integer) 19
127.0.0.1:6379> get views
"19"
127.0.0.1:6379> decrby view 5 //敲错了 应该是views
(integer) -5
127.0.0.1:6379> get views
"19"
127.0.0.1:6379> decrby views 5 //自减10
(integer) 14
127.0.0.1:6379> get views
"14"
127.0.0.1:6379> get view
"-5"
127.0.0.1:6379>
截取 替换字符串
127.0.0.1:6379> set key1 "hello, dhco"
OK
127.0.0.1:6379> get key1
"hello, dhco"
127.0.0.1:6379> getrange key1 0 3 //截取字符串[0,3]
"hell"
127.0.0.1:6379> getrange key1 0 -1
"hello, dhco"
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"
127.0.0.1:6379>
setex(set with expire) 设置过期时间
setnx (set if not exist) 不存在再设置(在分布式锁中会常常使用!)
127.0.0.1:6379> setex key3 30 "hello" 设置过期时间30s
OK
127.0.0.1:6379> ttl key3 查看过期时间 还有25s过期
(integer) 25
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> set nx mykey "redis"
(error) ERR syntax error
127.0.0.1:6379> setnx mykey "redis" //不存在这个键再设置
(integer) 1
127.0.0.1:6379> keys *
1) "mykey"
2) "key1"
3) "key2"
127.0.0.1:6379> get key3
(nil)
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> setnx mykey "mongoDB" 这个键已经存在,返回0表示设置失败
(integer) 0
127.0.0.1:6379> get mykey //mykey没变 还是第一次设置的redis
"redis"
127.0.0.1:6379>
mset
mget
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 //同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"
127.0.0.1:6379> mget k1 k2 k3 //同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4 //msetnx是一个原子性的操作,要么一起成功 要么一起失败
(integer) 0
127.0.0.1:6379> get k4
(nil)
127.0.0.1:6379>
127.0.0.1:6379> set user:1:name zhangsan user:1:age 2
(error) ERR syntax error
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "2"
//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"
127.0.0.1:6379>
String里面的value除了字符串还可以是数字
使用场景:
计数器(incr decr)
统计多单位的数量
粉丝数
对象缓存存储!
List列表
在redis里,可以把list根据需要来实现队列,栈等数据结构
所有的list命令是以l开头的
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"
127.0.0.1:6379>
LPOP
RPOP
127.0.0.1:6379> lpop list
//移除list的第一个元素
"three"
127.0.0.1:6379> rpop list
//移除list的最后一个元素
"two"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
3) "right"
4) "one"
127.0.0.1:6379> lindex list 1
//通过下标获取list中的某一个值
"one"
127.0.0.1:6379> lindex list 0
"two"
127.0.0.1:6379> lpush list one
(integer) 5
127.0.0.1:6379> llen list
//获取列表长度
(integer) 5
127.0.0.1:6379>
lrem list 1 one
//移除list集合中指定个数的value,精确匹配
lrem list 2 three
ltrim list 1 2
//通过下标截取指定的长度
//这个List已经被改变了,截断了只剩下截取的元素
小结:它实际上是一个链表。如果key不存在,创建新的链表;如果key存在,新增内容;如果移除了所有值,空链表,也代表不存在;
在两边插入或者改动值,效率最高,中间元素,相对来说效率会低一点。
Set集合
Set集合中的元素是不能重复的。
127.0.0.1:6379> sadd myset "hello"
//向set集合中添加元素
(integer) 1
127.0.0.1:6379> sadd myset "hello1"
(integer) 1
127.0.0.1:6379> sadd myset "hello1"
(integer) 0
127.0.0.1:6379> smembers myset
//查看指定set的所有值
1) "hello"
2) "hello1"
127.0.0.1:6379> sismember myset hello
//判断某一个值是不是在set集合中
//返回1说明在
(integer) 1
127.0.0.1:6379> sismember myset hello2
//返回0说明不再
(integer) 0
127.0.0.1:6379> scard myset
//获取set集合中的内容元素个数
(integer) 2
127.0.0.1:6379>
应用场景:
微博,A用户将所有关注的人放在一个set集合中,将它的粉丝也放在一个集合中!
Hash哈希
Map集合
本质和String类型没有太大区别。
127.0.0.1:6379> hset myhash field1 cpw
(integer) 1
127.0.0.1:6379> hget muhash field1
(nil)
127.0.0.1:6379> hget myhash field1
"cpw"
127.0.0.1:6379> hmset myhash field1 hello field2 world
OK
127.0.0.1:6379> hmget myhash field1 field2
1) "hello"
2) "world"
127.0.0.1:6379> hgetall myhash
//获取全部的数据
1) "field1"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379>
127.0.0.1:6379> hdel myhash field1
//删除hash指定key字段~对应的value值也就消失了
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
127.0.0.1:6379>
127.0.0.1:6379> hlen myhash
(integer) 1
127.0.0.1:6379> hkeys myhash
1) "field2"
127.0.0.1:6379> hvals myhash
1) "world"
127.0.0.1:6379>
hash更适合于对象的存储,经常需要变更的数据。我觉得是因为hash比string更快。
String更适合字符串存储
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> zadd salary 2500 c
(integer) 1
127.0.0.1:6379> zadd salary 5000 p
(integer) 1
127.0.0.1:6379> zadd salary 500 w
(integer) 1
127.0.0.1:6379> zrangebyscore salary -inf +inf
1) "w"
2) "c"
3) "p"
127.0.0.1:6379>