1、redis 菜鳥驛站(先在在這里學習redis的安裝、配置和命令行操作) http://www.runoob.com/redis/redis-tutorial.html
2、再介紹一個redis 圖形化工具(個人非常建議) redis desktop Manager https://www.cnblogs.com/zheting/p/7670154.html
3、node_redis 官方文檔 https://github.com/NodeRedis/node_redis
4、參考網址
https://www.cnblogs.com/harelion/p/5203710.html
https://blog.csdn.net/helencoder/article/details/51784654
Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
概念理解網址 1、https://blog.csdn.net/wang379275614/article/details/47172469
2、https://blog.csdn.net/tim_phper/article/details/51891097
string 常用命令: 除了get、set、incr、decr mget等操作外,Redis還提供了下面一些操作:獲取字符串長度、往字符串append內容、設置和獲取字符串的某一段內容、設置及獲取字符串的某一位(bit)、批量設置一系列字符串的內容
hash 常用命令: hget,hset,hmset,hmget,hgetall 等。
list 常用命令: lpush,rpush,lpop,rpop,lrange,BLPOP(阻塞版)等。
set 常用命令: sadd,srem,spop,sdiff ,smembers,sunion 等。
zset 常用命令: zadd,zrange,zrem,zcard等
我不懂得解釋,直接代碼。能用就行
先聲明版本
node 8.10.0
npm 5.8.0
redis 2.8.0(node_modules里的版本,不是軟件版本)

1 /* 2 * 下面有些命令的開頭是z 或者h 或者s的 3 * z表示有序列表的數據類型 4 * h表示hash的數據類型 5 * s表示set集合的數據類型 6 * l表示list列表的數據類型 7 * 8 * */ 9 10 const redis = require("redis"), 11 RDS_PORT = 6379, //服務器端口 12 RDS_HOST = '127.0.0.1', //服務器ip 13 RDS_OPTS = {}, //設置值 14 db = 1 15 client = redis.createClient({RDS_PORT, RDS_HOST,RDS_OPTS, db}); 16 17 let test = { 18 set: async () => { 19 client.set('token', "普通的種下token", function(err, res) { 20 console.log(err); 21 console.log(res); 22 }); 23 client.expire('token', 60*60*24*30); // 緩存30天 設置失效時間 24 25 /* 26 * set 也允許設置失效時間 27 * */ 28 // client.set('token', '普通的種下token', 'EX', 60*60*24*30); // 緩存30天 設置失效時間 29 }, 30 get: async () => { 31 /* 32 * 得到 33 * */ 34 client.get('token', function(err, reply) { 35 if(err) { 36 console.log("報錯了"); 37 console.log(err); 38 throw err; 39 // return; 40 } 41 if(reply) 42 console.log(reply); 43 else 44 console.log("沒有值"); 45 }); 46 47 // let reply = await new Promise(function(resolve, reject) { 48 // client.get('token', function(err, reply) { 49 // resolve(reply?reply:''); 50 // }); 51 // }); 52 // if(reply) 53 // console.log(reply); 54 // else 55 // console.log("沒有值"); 56 }, 57 remove: async ()=>{ 58 client.del("token",function(err, res) { 59 console.log(err); 60 console.log(res); 61 }); //刪除 62 // await client.del('token'); //刪除 支持await 63 }, 64 /* 65 * 單個key存儲 hash 66 * */ 67 hset: async ()=> { 68 client.hset('hset', 'key001', 'hello', function (err, res) { 69 if (err) { 70 console.log(err); 71 } else { 72 console.log('res:', res); 73 } 74 }); 75 }, 76 /* 77 * 單個key獲取 hash 78 * */ 79 hget: async ()=> { //單個key獲取 hash 80 client.hget('hset', 'key001', function (err, getRslt) { 81 if (err) { 82 console.log(err); 83 } else { 84 console.log('getRslt:', getRslt); 85 client.quit(); 86 } 87 }); 88 }, 89 /* 90 * 多個key存儲 hash 91 * */ 92 hmset: async ()=> { 93 // client.hmset("hosts", "mjr", "1", "another", "23", "home", "1234"); 94 client.hmset('hmset', {a:2,b:3,c:4}, function(err, response) { 95 if (err) { 96 console.log(err); 97 } else { 98 console.log(response); 99 // client.quit(); 100 } 101 }); 102 }, 103 /* 104 * 多個key獲取 hash 105 * */ 106 hmget: async () => { 107 client.hmget("hosts", "mjr", "another", "home", function(err, res) { 108 if (err) { 109 console.log(err); 110 } else { 111 console.log(res); 112 } 113 }); 114 client.hmget('hmset', ['a', 'c'], function (err, res) { 115 if (err) { 116 console.log(err); 117 } else { 118 console.log(res); 119 } 120 }); 121 }, 122 /* 123 * 124 * 參考網址 https://blog.csdn.net/qq_28893679/article/details/53005057 125 * 遍歷查詢所有的key 126 * 可以模糊查詢 性能可能損耗,建議獨立開一個db 127 * */ 128 keys: async () => { 129 client.keys("605*", function (err, replies) { 130 console.log(replies.length + " replies:"); 131 replies.forEach(function (reply, i) { 132 console.log(" " + i + ": " + reply); 133 }); 134 client.quit(); 135 }); 136 }, 137 /* 138 * 獲取hash數據類型鍵值為1的所有key值 139 * */ 140 hkeys: async () => { 141 client.hkeys("1", function (err, replies) { 142 if(err) throw err; 143 console.log(replies); 144 client.quit(); 145 }); 146 }, 147 /* 148 * 獲取hash數據類型鍵值為1的所有鍵值對數據 149 * */ 150 hgetall: async () => { 151 client.hgetall("1", function (err, obj) { 152 console.log("hgetall:",obj); 153 }); 154 }, 155 /* 156 * 無序集合 157 * */ 158 sadd: async () => { 159 client.sadd("sadd", "a member", redis.print); 160 client.sadd("sadd", "another member", redis.print); 161 let set_size = 10; 162 while (set_size > 0) { 163 client.sadd("bigset", "member " + set_size,redis.print); 164 set_size -= 1; 165 } 166 }, 167 /* 168 * 有序集合 169 * */ 170 zadd: async () => { 171 client.zadd('zadd',[1,'one',2,'ninety-nine',3,'hello'], function(err, response){ 172 if(err) throw err; 173 else { 174 console.log('added '+response+' items.'); 175 } 176 }) 177 }, 178 /* 179 * 返回無序集合 key 的基數(集合中元素的數量)。 180 * 也就是list數據類型里的列表長度 181 * 下面幾種對應不同的數據結構 182 * scard zcard hcard 183 * */ 184 scard: async () => { 185 client.scard("sadd",function(err,response){ 186 console.log(response); 187 console.log("Number of key sadd:" + response); 188 }); 189 }, 190 zcard: async () => { 191 client.zcard("sadd",function(err,response){ 192 console.log(response); 193 console.log("Number of key sadd:" + response); 194 }); 195 }, 196 rpush: async () => { 197 client.rpush("rpush", [1, 2, 3, 4, 5]); 198 }, 199 /* 200 * 下面幾種對應不同的數據結構 201 * hscan zscan sscan 202 * */ 203 zscan: async () => { 204 client.zscan('bisset', 2, 'COUNT', '0', function(err, res) { 205 console.log(err); 206 console.log(res); 207 console.log(res[1].length); 208 }); 209 }, 210 sscan: async () => { 211 client.sscan('zadd', 2, 'COUNT', '0', function(err, res) { 212 console.log(err); 213 console.log(res); 214 console.log(res[1].length); 215 }); 216 }, 217 hscan: async () => { 218 client.hscan('z', 2, 'COUNT', '0', function(err, res) { 219 console.log(err); 220 console.log(res); 221 console.log(res[1].length); 222 }); 223 }, 224 /* 225 * zcount方法獲取指定集合指定范圍內的元素個數,設定為-Infinity, Infinity時,可以獲取數組長度。 226 * */ 227 zcount: async () => { 228 client.zrange('zadd', -Infinity, Infinity, function(err, resp) { 229 console.log(err); 230 console.log("resp:", resp); 231 }); 232 }, 233 /* 234 * 根據元素在有序排列中的位置 235 * zrange方法獲取指定下標范圍的內的所有key值,包括起始位置和終止位置。 236 * */ 237 zrange: async () => { 238 client.zrange('zadd', 0, 1, function(err, resp) { 239 console.log(err); 240 console.log("resp:", resp); 241 }); 242 }, 243 /* 244 * 根據元素在有序排列中的位置 245 * 適用於列表數據類型的,set集合使用則會報錯 246 * */ 247 lrange: async () => { 248 client.lrange('rpush', 0, 1, function(err, resp) { 249 console.log(err); 250 console.log("resp:", resp); 251 }); 252 }, 253 /* 254 * 隨機返回一個key鍵 255 * */ 256 randomKey: async () => { 257 client.randomkey(function (err, reply) { 258 if (err) return false; 259 console.log(reply); 260 }); 261 }, 262 } 263 264 // test.set(); 265 // test.get(); 266 // test.remove() 267 // test.hset(); 268 // test.hget(); 269 // test.hmset(); 270 // test.hmget(); 271 // test.keys(); 272 // test.scard(); 273 // test.zcard(); 274 // test.rpush(); 275 // test.sadd(); 276 // test.zadd(); 277 // test.zscan(); 278 // test.sscan(); 279 // test.hscan(); 280 // test.zcount(); 281 // test.zrange(); 282 // test.lrange(); 283 284 // test.randomKey(); 285 286 // test.hkeys(); 287 288 // test.hgetall();