English 简体中文 繁體中文 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french
查看: 3|回复: 0

redis

[复制链接]
查看: 3|回复: 0

redis

[复制链接]
查看: 3|回复: 0

204

主题

0

回帖

622

积分

高级会员

积分
622
dzC7CkysG

204

主题

0

回帖

622

积分

高级会员

积分
622
2025-2-26 00:43:59 | 显示全部楼层 |阅读模式
  redis是一个开源(BSD许可)的,内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件MQ。它支持多种类型的数据结构,如字符串(String)、散列(Hash)、列表(List)、集合(Set)、有序集合(Sorted Sets)与范围查询(bitmaps、hyperloglogs)和地理空间(geospatial)索引半径查询。Redis内置了复制(replication)、LUA脚本(Lua Scripting)、LRU驱动事件、事务(Transactions)和不同级别的磁盘持久化(Persistence),并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性。redis不区分大小写命令。
 
000 || redis-key

127.0.0.1:6379> set name harley # 设置keyOK127.0.0.1:6379> 127.0.0.1:6379> keys *    # 查看当前数据库中所有的key1) "name"127.0.0.1:6379> 127.0.0.1:6379> exists name # 查看是否存在某key(integer) 1127.0.0.1:6379> 127.0.0.1:6379> move name 1 # 移除key(integer) 1127.0.0.1:6379> 127.0.0.1:6379> keys *(empty array)127.0.0.1:6379> 127.0.0.1:6379> set name harleyOK127.0.0.1:6379> 127.0.0.1:6379> keys *1) "name"127.0.0.1:6379> 127.0.0.1:6379> clear # 清屏127.0.0.1:6379> expire name 10 # 设置name的过期时间为10s(integer) 1127.0.0.1:6379> ttl name # 查看name的剩余过期时间(integer) 7127.0.0.1:6379> ttl name(integer) 3127.0.0.1:6379> get name # 查看name的值(nil)127.0.0.1:6379> set name harleyOK127.0.0.1:6379> type name # 查看key的类型string127.0.0.1:6379>
过期时间可以用于设置cookie的过期时间设置
 
 
001 || String

90%的java程序员使用redis只会使用一个String类型
127.0.0.1:6379> set key1 v1  # 设置值OK127.0.0.1:6379> get key1 # 获得值"v1"127.0.0.1:6379> keys * # 查看所有的键1) "key1"127.0.0.1:6379> exists key1 # 判断某key是否存在(integer) 1127.0.0.1:6379> append key1 "hello" # 追加字符串,如果key1不存在即新建(integer) 7127.0.0.1:6379> get key1 # 查看键"v1hello"127.0.0.1:6379> 127.0.0.1:6379> STRLEN key1 # 获取字符串的长度(integer) 7127.0.0.1:6379> APPEND key1 harley(integer) 13127.0.0.1:6379> STRLEN key1(integer) 13127.0.0.1:6379> get key1"v1helloharley"127.0.0.1:6379>计数器

127.0.0.1:6379> 127.0.0.1:6379> set views 0 # 初始值为0OK127.0.0.1:6379> get views"0"127.0.0.1:6379> INCR views # 自增1(integer) 1127.0.0.1:6379> get views"1"127.0.0.1:6379> INCR views(integer) 2127.0.0.1:6379> INCR views(integer) 3127.0.0.1:6379> get views"3"127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> decr views # 自减1(integer) 2127.0.0.1:6379> decr views(integer) 1127.0.0.1:6379> 127.0.0.1:6379> get views"1"127.0.0.1:6379> 127.0.0.1:6379> INCRBY views 10 # 步长10,自增10(integer) 11127.0.0.1:6379> 127.0.0.1:6379> DECRBY views 5 # 自减5(integer) 6字符串范围

127.0.0.1:6379> set key1 "hello,harley" # 设置key1的值OK127.0.0.1:6379> get key1"hello,harley"127.0.0.1:6379> GETRANGE key1 0 3 # 截取字符串[0,3]"hell"127.0.0.1:6379> GETRANGE key1 0 -1 # 获取全部的字符串 等同于get key"hello,harley"127.0.0.1:6379> set key2 abcdefgOK127.0.0.1:6379> get key2"abcdefg"127.0.0.1:6379> SETRANGE key2 1 hello # 替换指定位置开始的字符串(integer) 7127.0.0.1:6379> get key2"ahellog"127.0.0.1:6379> setex & setnx

127.0.0.1:6379> setex key3 30 "hello" # 设置过期时间30s, set with expireOK127.0.0.1:6379> ttl key3(integer) 27127.0.0.1:6379> get key3"hello"127.0.0.1:6379> setnx mykey "redis" # 不存在设置(在分布式锁中会常常使用)(integer) 1127.0.0.1:6379> ttl key3(integer) -2127.0.0.1:6379> keys *1) "key2"2) "mykey"3) "key1"127.0.0.1:6379> setnx mykey "MongoDB"# 如果当前key存在则创建失败,返回0(integer) 0127.0.0.1:6379> get mykey"redis"127.0.0.1:6379> 批量设置值

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 # 批量设置值OK127.0.0.1:6379> keys *1) "k3"2) "k1"3) "k2"127.0.0.1:6379> 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 # 是一个原子性操作,k1已存在,所以执行失败(integer) 0127.0.0.1:6379> keys *1) "k3"2) "k1"3) "k2"127.0.0.1:6379> 对象

127.0.0.1:6379> mset user1:1:name zhangsan user1:1:age 18 # 设置name和ageOK127.0.0.1:6379> mget user1:1:name user1:1:age # 批量获取值1) "zhangsan"2) "18"127.0.0.1:6379> getset

127.0.0.1:6379> getset db redis # 先返回get的值,再进行set(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" 
适用场景

String类似的使用场景,value除了字符串还可以是数字


  • 计数器
  • 统计多单位的数量:uid:572413118:follow 0
  • 粉丝数
  • 对象存储
 
 
002 || List

基本的数据类型,列表。在redis里可以把list当做栈、队列、阻塞队列
可以在list的左右两边同时插入值
127.0.0.1:6379> lpush list one # 将一个值或者多个值插入到列表的最左边(integer) 1127.0.0.1:6379> lpush list two(integer) 2127.0.0.1:6379> lpush list three(integer) 3127.0.0.1:6379> lrange list 0 -1 # 获取到列表的所有值1) "three"2) "two"3) "one"127.0.0.1:6379> lrange list 0 11) "three"2) "two"127.0.0.1:6379> lrange list 0 0 # 获取最新插入的值1) "three"127.0.0.1:6379> 127.0.0.1:6379> Rpush list four # 将值插入到列表最右边(integer) 4127.0.0.1:6379> lrange list 0 -11) "three"2) "two"3) "one"4) "four"127.0.0.1:6379> 127.0.0.1:6379> lrange list 0 -11) "three"2) "two"3) "one"4) "four"127.0.0.1:6379> Lpop list # 移除list第一个元素"three"127.0.0.1:6379> 127.0.0.1:6379> Rpop list # 移除list最后一个元素"four"127.0.0.1:6379> lrange list 0 -11) "two"2) "one"127.0.0.1:6379> 127.0.0.1:6379> lindex list 1 # 通过下标获取list中某一个值"one"127.0.0.1:6379> lindex list 0 "two"127.0.0.1:6379> 获取到列表的长度
127.0.0.1:6379> Lpush list one(integer) 1127.0.0.1:6379> Lpush list two(integer) 2127.0.0.1:6379> Lpush list three(integer) 3127.0.0.1:6379> 127.0.0.1:6379> Llen list # 获取列表的值(integer) 3127.0.0.1:6379> 移除元素
127.0.0.1:6379> lpush list one(integer) 1127.0.0.1:6379> lpush list two(integer) 2127.0.0.1:6379> lpush list three(integer) 3127.0.0.1:6379> llen list(integer) 3127.0.0.1:6379> lpush list three(integer) 4127.0.0.1:6379> lrange list 0 -11) "three"2) "three"3) "two"4) "one"127.0.0.1:6379> lrem list 1 one # 移除list指定个数的value(integer) 1127.0.0.1:6379> lrange list 0 -11) "three"2) "three"3) "two"127.0.0.1:6379> lrem list 2 three # 移除list中指定个数的value(integer) 2127.0.0.1:6379> lrange list 0 -11) "two"127.0.0.1:6379>只保留一部分值trim操作
127.0.0.1:6379> rpush mylist "hello"(integer) 1127.0.0.1:6379> rpush mylist "hello1"(integer) 2127.0.0.1:6379> rpush mylist "hello2"(integer) 3127.0.0.1:6379> rpush mylist "hello3"(integer) 4127.0.0.1:6379> ltrim mylist 1 2 # 通过下标截取指定的长度,list的值发生变化OK127.0.0.1:6379> lrange mylist 0 -11) "hello1"2) "hello2"127.0.0.1:6379> rpoplpush

移除列表的最后一个元素,并将其移动到新的列表中
127.0.0.1:6379> rpush mylist "hello"(integer) 1127.0.0.1:6379> rpush mylist "hello1"(integer) 2127.0.0.1:6379> rpush mylist "hello2"(integer) 3127.0.0.1:6379> rpoplpush mylist myotherlist"hello2"127.0.0.1:6379> lrange mylist 0 -11) "hello"2) "hello1"127.0.0.1:6379> lrange myotherlist 0 -11) "hello2"127.0.0.1:6379> lset

将列表中指定下标的值替换为另外一个值,更新操作
127.0.0.1:6379> exists list # 判断这个列表是否存在(integer) 0127.0.0.1:6379> lset list 0 item # 如果不存在列表,更新时会报错(error) ERR no such key127.0.0.1:6379> 127.0.0.1:6379> lpush list value1(integer) 1127.0.0.1:6379> lrange list 0 01) "value1"127.0.0.1:6379> lset list 0 item # 如果存在,则会更新指定下标的值OK127.0.0.1:6379> lrange list 0 01) "item"127.0.0.1:6379> 127.0.0.1:6379> lset list 1 other # 如果不存在,则会报错(error) ERR index out of range127.0.0.1:6379> linsert

将某个具体的value插入到list中某个元素的前面或者后面
127.0.0.1:6379> rpush mylist "hello"(integer) 1127.0.0.1:6379> rpush mylist "world"(integer) 2127.0.0.1:6379> linsert mylist before world my(integer) 3127.0.0.1:6379> lrange mylist 0 -11) "hello"2) "my"3) "world"127.0.0.1:6379> linsert mylist after my only(integer) 4127.0.0.1:6379> lrange mylist 0 -11) "hello"2) "my"3) "only"4) "world"127.0.0.1:6379>  

  • 实际上是一个链表,before Node after,可以在left和right都可以插入值
  • 如果key不存在,则创建新的链表
  • 如果key存在,则新增元素
  • 如果移除了所有的值,则为空链表
  • 在两边插入或者更新值,效率最高!中间元素,效率会比较低。
适用场景


  • 消息队列

 
 
003 || Set

 
127.0.0.1:6379> sadd myset hello # 向set中添加元素(integer) 1127.0.0.1:6379> sadd myset harley(integer) 1127.0.0.1:6379> smembers myset # 查看set中的值1) "harley"2) "hello"127.0.0.1:6379> sadd myset loveyl(integer) 1127.0.0.1:6379> smembers myset 1) "harley"2) "loveyl"3) "hello"127.0.0.1:6379> sadd myset hello # set中的值是无序且不重复的(integer) 0127.0.0.1:6379> 127.0.0.1:6379> sismember myset harley # 查看set中是否存在某值(integer) 1127.0.0.1:6379> sismember myset hello(integer) 1scard

获取set集合中内容元素个数
127.0.0.1:6379> smembers myset1) "harley"2) "loveyl"3) "hello"127.0.0.1:6379> scard myset(integer) 3srem

移除set中的指定值
127.0.0.1:6379> srem myset hello(integer) 1127.0.0.1:6379> smembers myset1) "harley"2) "loveyl"127.0.0.1:6379> scard myset(integer) 2127.0.0.1:6379> srandmemeber

随机抽选出一个元素
127.0.0.1:6379> smembers myset1) "hahaha"2) "harley"3) "world"4) "loveyl"5) "hello"127.0.0.1:6379> srandmember myset"harley"127.0.0.1:6379> srandmember myset"world"127.0.0.1:6379> srandmember myset"hello"127.0.0.1:6379> srandmember myset"loveyl"127.0.0.1:6379> 127.0.0.1:6379> srandmember myset 21) "loveyl"2) "world"127.0.0.1:6379> spop

随机删除一个元素
127.0.0.1:6379> spop myset"hello"127.0.0.1:6379> spop myset"hahaha"127.0.0.1:6379> smembers myset1) "loveyl"2) "harley"3) "world"127.0.0.1:6379> smove

将一个指定的值移动到另外一个set中
127.0.0.1:6379> sadd myset hello(integer) 1127.0.0.1:6379> sadd myset world(integer) 1127.0.0.1:6379> sadd myset harley(integer) 1127.0.0.1:6379> smove myset myset2 harley(integer) 1127.0.0.1:6379> smembers myset21) "harley"127.0.0.1:6379> smembers myset1) "world"2) "hello"127.0.0.1:6379> 差集 & 交集 & 并集

127.0.0.1:6379> sadd key1 a(integer) 1127.0.0.1:6379> sadd key1 b(integer) 1127.0.0.1:6379> sadd key1 c(integer) 1127.0.0.1:6379> sadd key2 c(integer) 1127.0.0.1:6379> sadd key2 d(integer) 1127.0.0.1:6379> sadd key2 e(integer) 1127.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> 127.0.0.1:6379> sunion key1 key2 # 并集1) "a"2) "b"3) "c"4) "e"5) "d"127.0.0.1:6379>  
004 || Hash

127.0.0.1:6379> hset myhash field1 harley # set一个具体的key-value(integer) 1127.0.0.1:6379> hget myhash field1"harley"127.0.0.1:6379> hmset myhash field1 hello field2 world # set多个key-valueOK127.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> hdel myhash field1 # 删除指定的key,value也会被删除(integer) 1127.0.0.1:6379> hgetall myhash1) "field2"2) "world"127.0.0.1:6379> 127.0.0.1:6379> hlen myhash # 查看hash的字段数量(integer) 1127.0.0.1:6379>127.0.0.1:6379> hexists myhash field1 # 判断hash中指定字段是否存在(integer) 0127.0.0.1:6379> hexists myhash field2(integer) 1127.0.0.1:6379> 127.0.0.1:6379> hkeys myhash # 获取所有的字段1) "field2"127.0.0.1:6379> hvals myhash # 获取所有的值1) "world"hincrby & hsetnx

127.0.0.1:6379> hset myhash field3 5 (integer) 1127.0.0.1:6379> hincrby myhash field3 1 # 指定增量(integer) 6127.0.0.1:6379> hgetall myhash1) "field3"2) "6"127.0.0.1:6379> hincrby myhash field3 -2(integer) 4127.0.0.1:6379> hgetall myhash1) "field3"2) "4"127.0.0.1:6379> hsetnx myhash field4 hello # 如果不存在可以设置值(integer) 1127.0.0.1:6379> hsetnx myhash field4 world # 如果存在则会执行失败(integer) 0127.0.0.1:6379> hash变更的数据user

127.0.0.1:6379> hset user:1 name harley(integer) 1127.0.0.1:6379> hget user:1 name"harley"127.0.0.1:6379> 适用场景


  • 可以用于存储用户信息、经常变动的信息。
  • hash更适合于对象的存储,String更适合字符串存储。
 
 
005 || Zset

有序集合,在set的基础上增加了一个值
127.0.0.1:6379> zadd myzset 1 one(integer) 1127.0.0.1:6379> zadd myzset 2 two(integer) 1127.0.0.1:6379> zadd myzset 3 three 4 four # 添加多个值(integer) 2127.0.0.1:6379> zrange myzset 0 -11) "one"2) "two"3) "three"4) "four"127.0.0.1:6379> zrangebyscore

排序
127.0.0.1:6379> zadd salary 2500 harley(integer) 1127.0.0.1:6379> zadd salary 5000 cc_zeal(integer) 1127.0.0.1:6379> zadd salary 500 jone(integer) 1127.0.0.1:6379> zrangebyscore salary -inf +inf # 按照score升序排列1) "jone"2) "harley"3) "cc_zeal"127.0.0.1:6379> 127.0.0.1:6379> zrevrange salary 0 -1 # 降序排列1) "cc_zeal"2) "harley"3) "jone"127.0.0.1:6379> 127.0.0.1:6379> zrangebyscore salary -inf +inf withscores1) "jone"2) "500"3) "harley"4) "2500"5) "cc_zeal"6) "5000"127.0.0.1:6379>127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores # 显示小于2500的升序排列1) "jone"2) "500"3) "harley"4) "2500"127.0.0.1:6379> zrem

127.0.0.1:6379> zrange salary 0 -11) "jone"2) "harley"3) "cc_zeal"127.0.0.1:6379> zrem salary jone # 移除有序集合中指定的元素(integer) 1127.0.0.1:6379> zrange salary 0 -11) "harley"2) "cc_zeal"127.0.0.1:6379> 127.0.0.1:6379> zcard salary # 获取有序集合中的个数(integer) 2127.0.0.1:6379> 127.0.0.1:6379> zadd myset 1 hello(integer) 1127.0.0.1:6379> zadd myset 2 world 3 harley(integer) 2127.0.0.1:6379> zcount myset 1 3 # 获取指定区间成员数量(integer) 3127.0.0.1:6379> zcount myset 1 2(integer) 2127.0.0.1:6379>  
006 || Geospatial

地理位置,推算地理位置的信息,两地之间的距离。
geoadd

添加地理位置,两极无法直接添加,一般会下载城市数据,用java程序一次性导入
key 值(维度、精度、名称)
127.0.0.1:6379> geoadd china:city 116.40 39.90  beijing # 添加城市的坐标(integer) 1127.0.0.1:6379> geoadd china:city 121.47 31.23  shanghai(integer) 1127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing(integer) 1127.0.0.1:6379> geoadd china:city 114.05 22.52 shenzhen(integer) 1127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26  xian(integer) 2geops

127.0.0.1:6379> geopos china:city beijing # 获取指定城市的经度纬度1) 1) "116.39999896287918091"   2) "39.90000009167092543"127.0.0.1:6379> geopos china:city beijing shanghai1) 1) "116.39999896287918091"   2) "39.90000009167092543"2) 1) "121.47000163793563843"   2) "31.22999903975783553"127.0.0.1:6379> geodist

127.0.0.1:6379> geodist china:city beijing shanghai # 获取两地的直线距离"1067378.7564"127.0.0.1:6379> 127.0.0.1:6379> geodist china:city beijing shanghai km # 获取两地的直线距离(单位km)"1067.3788"127.0.0.1:6379> georadius

以给定的经纬度为中心,找出某一半径内的元素
127.0.0.1:6379> georadius china:city 110 30 1000 km1) "chongqing"2) "xian"3) "shenzhen"4) "hangzhou"127.0.0.1:6379> georadius china:city 110 30 500 km1) "chongqing"2) "xian"127.0.0.1:6379> 127.0.0.1:6379> georadius china:city 110 30 500 km withcoord # 经纬度1) 1) "chongqing"   2) 1) "106.49999767541885376"      2) "29.52999957900659211"2) 1) "xian"   2) 1) "108.96000176668167114"      2) "34.25999964418929977"127.0.0.1:6379> georadius china:city 110 30 500 km withdist # 直线距离1) 1) "chongqing"   2) "341.9374"2) 1) "xian"   2) "483.8340"georadiusbymember

找出指定元素周围的其他元素
127.0.0.1:6379> georadiusbymember china:city shanghai 500 km1) "hangzhou"2) "shanghai"127.0.0.1:6379> geohash

将二维的经纬度转换为一维的字符串,如果两个字符串越接近,距离越接近
127.0.0.1:6379> geohash china:city beijing chongqing1) "wx4fbxxfke0" # 经纬度hash2) "wm5xzrybty0" # 经纬度hash127.0.0.1:6379> 清除

geo底层是zset,可以使用zset的命令清除掉geo的元素
127.0.0.1:6379> zrange china:city 0 -11) "chongqing"2) "xian"3) "shenzhen"4) "hangzhou"5) "shanghai"6) "beijing"127.0.0.1:6379> zrem china:city xian(integer) 1127.0.0.1:6379> zrange china:city 0 -11) "chongqing"2) "shenzhen"3) "hangzhou"4) "shanghai"5) "beijing"127.0.0.1:6379>  
007 || Hyperloglog


 
 
 
008 || bitmap


 
 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

204

主题

0

回帖

622

积分

高级会员

积分
622

QQ|智能设备 | 粤ICP备2024353841号-1

GMT+8, 2025-3-11 07:06 , Processed in 0.797557 second(s), 26 queries .

Powered by 智能设备

©2025

|网站地图